メモリを効率的に解放できるように、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 メモリ