【发布时间】:2012-10-02 11:16:48
【问题描述】:
我有几个非常大的文件,每个 500MB++ 大小,包含整数值(实际上它有点复杂),我正在循环读取这些文件并计算所有文件的最大值。由于某种原因,内存在处理过程中不断增长,看起来 GC 从未释放由lines 的先前实例获取的内存。
我无法流式传输数据,必须为每个文件使用GetFileLines。假设为一个文件存储lines 所需的实际内存量是500MB,为什么在处理了10 个文件后使用5GB 的RAM?最终它在 15 个文件后因内存不足异常而崩溃。
计算:
int max = int.MinValue;
for (int i = 0; i < 10; i++)
{
IEnumerable<string> lines = Db.GetFileLines(i);
max = Math.Max(max, lines.Max(t=>int.Parse(t)));
}
GetFileLines 代码:
public static List<string> GetFileLines(int i)
{
string path = GetPath(i);
//
List<string> lines = new List<string>();
string line;
using (StreamReader reader = File.OpenText(path))
{
while ((line = reader.ReadLine()) != null)
{
lines.Add(line);
}
reader.Close();
reader.Dispose(); // should I bother?
}
return lines;
}
【问题讨论】:
-
你调用
lines.Clear()方法吗? -
10 x 500 Mb = 5 GB。您将所有文件内容保留在列表 List
行 中。与 ReadAllLines() 的性能相同 -
如果您有指向行的指针,垃圾收集器将不会清除内存。处理完行后,您必须 clear() 集合
-
不是这样,因为每个文件总是有一个新的列表实例,GC应该清理最后一个
-
你正在返回列表!你用它做什么?
标签: c# streamreader