TextWriter / StreamWriter内存使用率很高

时间:2014-12-17 05:23:58

标签: c# streamwriter textwriter

我有一个控制台应用程序,它读入一个包含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的RAM,所以我确信它的内存不足,因为我没有足够的内存。

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

2 个答案:

答案 0 :(得分:1)

如果平均线长为1KB,则40K线为40MB,没有任何内容。这就是为什么,我非常确定您的存储库类中存在问题。如果是EF存储库,请尝试为每一行重新创建DbContext。

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

var timer = Stopwatch.StartNew();
...
Console.WriteLine(timer.ElapsedMilliseconds);

答案 1 :(得分:0)

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

  • 通过一些假人替换存储库,例如class dummy_repository只有三个属性id,value,hash。
  • 同样会创建一个很长的“列表”,例如40k小条目。
  • 运行你的程序,看它是否仍然消耗内存(我很确定它不会)
  • 然后一步一步地添加原始部件。看看哪一步导致内存泄漏。