4

ユーザーが特定の列を引き出して、必要なものだけを含むはるかに小さい別のcsvファイルに書き込むことができるように、多くの列を持つ一連のcsvファイルを処理するプログラムがあります。最大 800 万行になる可能性があるため、リストを使用してキュー システムを作成しました。このシステムでは、リスト バッファーにピース (一度に 50000 行) を追加して、ライターがそのピースを書き込めるようにし、それを使用listbuffer[i].clear();して削除します。これにより、メモリの使用量を大幅に削減し、バッファを 10 個のアイテムのみに制限して、必要なだけメモリの使用量を抑えます。

私の問題は、listbuffer[i].clear();プログラム全体が終了し、次の使用のために空白になるようにバッファを再初期化するまで、以前に使用したメモリを解放しないことです。

**リストバッファはList<List<List<string>>>

これだけで、もう少し意味が分かります...

listbuffer[行のチャンク][行番号][列番号]

使用しているメモリを解放するようにリストに指示する方法はありlist[i]ますか?

ありがとう!

4

3 に答える 3

6

はい、使用List<T>.Clear()すると、リスト内のすべてのオブジェクトへの参照がクリアされ、Countプロパティが0に設定されます。オブジェクト参照を格納する基になる配列への参照は解放されません。Capacity プロパティをクリアした後に 0 に設定して、その配列への参照を解放できます。

実際に OOM の問題がある場合、これを行うことは完全な解決策ではなく、アドレス空間の断片化の問題がさらに発生する可能性があります。ラージ オブジェクト ヒープに大量のガベージが作成されないようにするためのヒントについては、この回答を確認してください。

于 2012-06-13T15:24:44.643 に答える
3

手遅れかもしれませんが、私はこの拡張機能を作成して、大きなリストからメモリをクリアしました。

それは私にとってはうまくいきました。

拡大:

public static void LiberarLista<T>(this List<T> lista)
{
     lista.Clear();            
     int identificador = GC.GetGeneration(lista);
     GC.Collect(identificador, GCCollectionMode.Forced);
}

例:

List<YourObject> hugeList= LetsRockBigData();

// Your code logic here 
// Finish... Let's clear the huge list 

hugeList.LiberarLista();

英語の専門家ではないことをお詫びします。ブラジル出身の DotNerd は 1 人だけで、それはすべての人々です...

于 2016-12-16T21:45:30.553 に答える