我有幾個非常大的文件,每個500MB++
大小,包含整數值(實際上它有點複雜),我在循環中讀取這些文件,並計算最大值全部文件。由於某些原因,在處理過程中內存不斷增長,看起來GC從未釋放內存,由之前的lines
實例獲取。內存泄漏(?)與StreamReader
我無法對數據進行流式處理,必須爲每個文件使用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()'方法嗎? – opewix
我不'應該嗎? – user1514042
10 x 500 Mb = 5 GB。您將所有文件內容保存在列表中*列表行*。與ReadAllLines()相同的性能() –
Cybermaxs