我需要处理一个非常大的文本文件(6-8 GB)。我写了下面附上的代码。不幸的是,每次输出文件达到(在源文件旁边创建)达到~2GB 时,我观察到内存消耗突然增加(~100MB 到几 GB)和结果 -内存不足异常。
调试器指示 OOM 发生在while ((tempLine = streamReader.ReadLine()) != null) 我仅针对 .NET 4.7 和 x64 架构。单行最多 50 个字符长。
我可以解决这个问题并将原始文件拆分为较小的部分,以免在处理时遇到问题并将结果合并回一个文件,但我不想这样做。
代码:
public async Task PerformDecodeAsync(string sourcePath, string targetPath)
{
var allLines = CountLines(sourcePath);
long processedlines = default;
using (File.Create(targetPath));
var streamWriter = File.AppendText(targetPath);
var decoderBlockingCollection = new BlockingCollection<string>(1000);
var writerBlockingCollection = new BlockingCollection<string>(1000);
var producer = Task.Factory.StartNew(() =>
{
using (var streamReader = new StreamReader(File.OpenRead(sourcePath), Encoding.Default, true))
{
string tempLine;
while ((tempLine = streamReader.ReadLine()) != null)
{
decoderBlockingCollection.Add(tempLine);
}
decoderBlockingCollection.CompleteAdding();
}
});
var consumer1 = Task.Factory.StartNew(() =>
{
foreach (var line in decoderBlockingCollection.GetConsumingEnumerable())
{
short decodeCounter = 0;
StringBuilder builder = new StringBuilder();
foreach (var singleChar in line)
{
var positionInDecodeKey = decodingKeysList[decodeCounter].IndexOf(singleChar);
if (positionInDecodeKey > 0)
builder.Append(model.Substring(positionInDecodeKey, 1));
else
builder.Append(singleChar);
if (decodeCounter > 18)
decodeCounter = 0;
else ++decodeCounter;
}
}
});
非常感谢解决方案以及如何对其进行更多优化的建议。
慕村225694
qq_笑_17
相关分类