2017-01-04 14 views
0

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(); 

    } 
} 
+1

問題は何ですか? GCがメモリを再利用しない場合は、その必要がないためです。あなたが投稿したコードから、何か間違っているようには見えません。 – InBetween

+0

@InBetween問題は、 'foreach'の2回目のパスでメモリー不足例外が発生します – Rijnhardt

+0

32ビット環境で実行していますか? – InBetween

答えて

-2

usingに全部を入れてみてください:

using (var lines = new List<string>()) 
{ ... } 

私は、ネストされたusing Sについてはよく分からないが。

lines.Clear;がある場合は、を追加してください。それはガベージコレクタを奨励するはずです。

+0

'List 'は 'IDisposable'を実装していないので、これはコンパイルされません。管理されていないリソースはありません。 – Servy