我有一个控制台应用程序,它读入一个包含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:更改了存储库的名称,因为这是误导性的。
答案 0 :(得分:1)
如果平均线长为1KB,则40K线为40MB,没有任何内容。这就是为什么,我非常确定您的存储库类中存在问题。如果是EF存储库,请尝试为每一行重新创建DbContext。
如果要调整程序,则可以使用以下方法:尝试将时间戳添加到控制台输出,可以使用Stopwatch类,并尝试每10或100或N行重新创建存储库。然后,查看时间戳,您可以找到要使用的最佳N.
var timer = Stopwatch.StartNew();
...
Console.WriteLine(timer.ElapsedMilliseconds);
答案 1 :(得分:0)
从查看代码我认为问题不是Streamwriter而是存储库中的一些内存泄漏。建议检查: