私は画像処理プロジェクトに取り組んでいます、私のアプリケーションでは、フォルダから画像を1つずつ処理しています(whileループで画像を処理しています)、フォルダには1000を超える画像が含まれています。ガベージコレクション(GC.Collect()を使用しています)4画像カウントごと。1000枚の画像を処理した後OutOfMemoryException
(ビットマップ画像が画像ボックスに割り当てられている場合は例外が通過します)、この問題を解決するにはどうすればよいですか?
3 に答える
どちらでもない。悪いことをせずにこれらの例外を取得してもまったく問題ありません。大きなヒープの断片化は、まだ解決されていない問題です。
メイン アプリケーションの制御下で画像がなくなるまで処理する別のプロセスを開く (その後再起動する) か、64 ビットに移行するのが最善の方法です (スペースが大きいほど、断片化の問題が発生しにくくなります)。
ビットマップ画像がピクチャボックスに割り当てられている場合、例外は通過します
これには、1 つのチャンクで多くのメモリが必要です。それらの画像について教えてください。それらはどのくらいの大きさですか?なぜピクチャボックスなのか (通常、バッチ処理では画像を見る必要はありません)。とにかく、これは定義済みの問題であり、画像が大きい場合は当然のことです。
それはあなたが画像をどのように使用しているかによります。関連するインスタンスを破棄していない可能性があります。インスタンスをusingステートメントでラップしてみてください。
using (var image = ...new instance created...)
{
// ...do stuff...
}
メモリリークを探します。WinDbgはgcrootコマンドで使用できます。以下のリンクを参照してください。
あなたは容疑者を調査する必要があります。SOSデバッグ拡張機能を使用できます。次のコマンドは、メモリ内のクラスのインスタンスとそのアドレスのリストを表示します。
!DumpHeap -type LeakingClass
次に、アドレスを使用してGCRootを呼び出し、オブジェクトをメモリに固定するものを確認します。
!GCRoot <your address here>
DumpHeapコマンドの結果からアドレスをコピーして貼り付けることができます。