this SO Questionのアドバイスに従った。それは私のために働かなかった。ここに私の状況と私のコードはそれに関連付けられている大きいリストに関連付けられたメモリを消去する
私は非常に大きなリストを持って、それに2.04Mの項目があります。私はそれを並べ替えるためにメモリに読み込んだ後、.csv
ファイルに書き込みます。私は11 .csv
のファイルを読んでからソートする必要があります。最初の反復で私にはわずか1GBを超えるメモリ使用量が与えられます。リストをnull
に設定しようとしました。私はList.Clear()
も試しましたが、List.TrimExcess()
も試しました。私はまた、GC
がそのことをするのを待っていました。そのリストには読んだり書いたりすることがないことを知っていることを期待しています。
ここに私のコードを使用しています。アドバイスはいつも大変ありがとうございます。
foreach (var zone in zones)
{
var filePath = string.Format("outputs/zone-{0}.csv", zone);
var lines = new List<string>();
using (StreamReader reader = new StreamReader(filePath))
{
var headers = reader.ReadLine();
while(! reader.EndOfStream)
{
var line = reader.ReadLine();
lines.Add(line);
}
//sort the file, then rewrite the file into inputs
lines = lines.OrderByDescending(l => l.ElementAt(0)).ThenByDescending(l => l.ElementAt(1)).ToList();
using (StreamWriter writer = new StreamWriter(string.Format("inputs/zone-{0}-sorted.csv", zone)))
{
writer.WriteLine(headers);
writer.Flush();
foreach (var line in lines)
{
writer.WriteLine(line);
writer.Flush();
}
}
lines.Clear();
lines.TrimExcess();
}
}
問題は何ですか? GCがメモリを再利用しない場合は、その必要がないためです。あなたが投稿したコードから、何か間違っているようには見えません。 – InBetween
@InBetween問題は、 'foreach'の2回目のパスでメモリー不足例外が発生します – Rijnhardt
32ビット環境で実行していますか? – InBetween