それぞれの500MB++
サイズが整数値を含む非常に大きなファイルがいくつかあります (実際にはもう少し複雑です)。これらのファイルをループで読み取り、すべてのファイルの最大値を計算しています。なんらかの理由で、処理中にメモリが絶えず増加しています。GC は、 の以前のインスタンスによって取得されたメモリを決して解放しないようですlines
。
データをストリーミングできず、GetFileLines
ファイルごとに使用する必要があります。lines
1 つのファイルを格納するのに必要な実際のメモリ量が であるとすると、 10 個のファイルを処理した後に慣れてしまうのは500MB
なぜですか? 最終的に、15 個のファイルの後、メモリ不足の例外でクラッシュします。5GB
RAM
計算:
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;
}