0

我有一个控制台应用程序,它读取一个包含 40k+ 行的大型文本文件,每一行都是我在搜索中使用的键,结果将写入输出文件。问题是我让这个控制台应用程序运行了一段时间,直到它突然关闭,我意识到当我上次看到它崩溃时,进程内存使用率真的很高,只有 1.6gb。

我环顾四周并没有找到很多答案我确实尝试使用 gcAllowVeryLargeObjects 但这似乎我只是在回避这个问题。

下面是我写到文件的 main() 的片段。我似乎无法理解为什么内存使用率如此之高。每次写入后我都会刷新写入器(可能是因为我将文件保持打开这么长时间吗?)。

TextWriter writer = new StreamWriter("output.csv", false));
foreach (var item in list)
 {
  Console.WriteLine("{0}/{1}", count, numofitem);
  var result = TableServiceContext.Read(p.id);
  if (result != null)
  {

   writer.WriteLine(String.Join(",", result.id,
   result.code,
   result.hash));

  }
  count++;
  writer.Flush();
 }
 writer.Close();

编辑:我的电脑上有 32gb 的内存,所以我确信它没有内存不足,因为我没有足够的内存。

Edit2:更改了存储库的名称,因为这具有误导性。

4

2 回答 2

1

如果平均行长是 1KB,那么 40K 行就是 40MB,什么都没有。这就是为什么,我很确定问题出在您的存储库类中。如果是 EF 存储库,请尝试为每一行重新创建 DbContext。

如果你想调整你的程序,那么,你可以使用以下方法:尝试将时间戳放入控制台输出,你可以使用 Stopwatch 类,并尝试每 10 或 100 或 N 行重新创建存储库。然后,查看时间戳,您可以找到要使用的最佳 N。

var timer = Stopwatch.StartNew();
...
Console.WriteLine(timer.ElapsedMilliseconds);
于 2014-12-17T06:16:16.000 回答
0

通过查看代码,我认为问题不是 Streamwriter,而是您的存储库中的一些内存泄漏。检查建议:

  • 将存储库替换为一些虚拟类,例如类 dummy_repository 仅具有三个属性 id、value、hash。
  • 同样创建一个长“列表”,例如 40k 小条目。
  • 运行你的程序,看看它是否仍然消耗内存(我很确定它不会)
  • 然后逐步添加回您的原始零件。查看哪个步骤导致内存泄漏。
于 2014-12-17T05:49:27.447 回答