0

メモリを効率的に解放できるように、DataTable や List を強制的に縮小するにはどうすればよいですか? 現在、ループの反復ごとに DataSet から処理された行を削除していますが、メモリが解放されているかどうかはわかりません。

for (int i = m_TotalNumberOfLocalRows - 1; i >= 0; i--)
{
   dr = dt.Rows[i];
   // Do stuff
   dt.Rows.Remove(dr);
}

これがメモリ内の DataTable のフットプリントを縮小しない場合は、List を使用できます。DataTable を DataRows のストアとしてのみ使用しています。メモリが少なく、x 回の反復ごとにメモリを解放できるコレクションまたはストレージ メカニズムを使用できます。

ありがとうございました。



編集: What Are Some Good .NET Profiler? を読んだ後、いくつかのメモリ プロファイリングを行った後。メモリの主な消費者は文字列であることを発見しました。

このプロセス中に多くのユーザー出力を行っており、メモリ消費量は約 170MB から 230MB の間で循環しており、約 300MB でピークに達しています。初期サイズが 20971520 の StringBuilder を使用して、何が起こっているかの出力/ログを保持しています。レコードの総数の 1% が処理された後、DevExpress MemoEdit コントロールの Text プロパティを StringBuilder.ToString に設定しています。 (). このメソッドは、StringBuilder.ToString() を MemoEdit.Text に追加するよりも速いことがわかりました (明らかに、StringBuilder に関するロジックは、MemoEdit.Text の追加と設定で異なります)。

また、StringBuilder(20971520) を再作成する代わりに、メモリ上で簡単に実行できることもわかりました。StringBuilder.Remove(0, StringBuilder.Length)

大きな文字列を操作する際のパフォーマンスを向上させるために共有できるヒントはありますか (ログを含むログ ファイルは、約 30 000 レコードに対して約 12.2 MB です)。

注: 質問のタイトルとタグを変更しました。
旧タイトル:DataTable や List を強制的に縮小してメモリを解放するにはどうすればよいですか?
古いタグ: リスト データ テーブル c# .net メモリ

4

4 に答える 4

4

メモリに問題がない限り、ガベージコレクタを呼び出して手動でメモリを解放しようとしないでください。実行時間はそれを処理し、99%の時間は、最適な時間がいつであるかを推測しようとすることによって、あなたよりも効率的です。

覚えておく必要があるのは、GC.Collect()を呼び出すと、ガベージコレクションのすべてのレベルに対して実行され、解放する必要のあるすべてのオブジェクトを「整理」することです。ほとんどの場合、その時点で実行する必要のない処理にプロセッサ時間などを費やすことになります。

あなたが絶対にコマンドをしなければならない場合はGC.Collect()

http://msdn.microsoft.com/en-us/library/xe0c2357.aspx

http://www.developer.com/net/csharp/article.php/3343191/C-Tip-Forcing-Garbage-Collection-in-NET.htm

于 2010-01-07T14:08:25.963 に答える
1

ガベージ コレクター パスを強制してみてください。

GC.Collect();

コードの実行を続行する前にすべてのオブジェクトがファイナライズされていることを確認したい場合は、

GC.WaitForPendingFinalizers();

GC.Collect() の直後


編集:以下のコメントで言及されているように、ガベージ コレクターを直接呼び出すことは悪い習慣であると広く考えられています。それにもかかわらず、これは、削除された行の未使用のメモリを解放するという目標を達成するはずです。

于 2010-01-07T14:06:05.440 に答える
0

これを直接管理する明確な必要性がありますか?ガベージコレクターがこれを管理します。

于 2010-01-07T14:07:42.630 に答える
0

あなたの例のように、DataTableに固執し、不要な行を削除してください。

これを行うと、メモリの使用を制御できなくなります。これは、CLR ガベージ コレクターによって行われます。

于 2010-01-07T14:06:32.570 に答える