2012-02-09 13 views
0

私は画像処理プロジェクトに取り組んでいます。私のアプリケーションでは、フォルダから1つの画像を処理しています(私はwhileループで画像を処理しています)。 4つのイメージカウントごとにガベージコレクション(GC.Collect()) 1000画像を処理した後にOutOfMemoryException(ビットマップイメージがピクチャボックスに割り当てられている場合は除外されます)の問題を解決する方法はありますか?どのようにOutOfMemoryExceptionを解決するには#

+0

どのような関数がエラーを生成しますか? – Gabe

+0

ビットマップイメージがピクチャボックスに割り当てられている場合は例外が発生します –

+1

GC.Collect()..は決して使用しないでください。特にループ内には使用しないでください。これは本当に問題を起こし、すべてのオブジェクト世代をアップグレードし、単にGCを役に立たなくします。それは問題自体を引き起こす可能性もあります... 以下の他の解決策を参照し、回収方法 –

答えて

0

どのように画像を使用しているかによって異なります。関連するインスタンスを破棄していない可能性があります。 usingステートメントを使用してラップしてみてください。

0

メモリリークを探します。 gcrootコマンドでWinDbgを使うことができます。下のリンクを参照してください。

http://blogs.msdn.com/b/delay/archive/2009/03/11/where-s-your-leak-at-using-windbg-sos-and-gcroot-to-diagnose-a-net-memory-leak.aspx

あなたは容疑者を調査する必要があります。 SOSデバッグ拡張機能を使用することができます。

!DumpHeap -type LeakingClass 

が続いアドレスでGCRootを呼び出し、メモリ内のオブジェクトをピンか見て: 次のコマンドを使用すると、メモリ内のクラスのインスタンスとそのアドレスのリストを提供します

!GCRoot <your address here> 

ますDumpHeapコマンドの結果からアドレスを貼り付けることができます。

1

それは非常に悪いことをすることなく、それらの例外を得るためにタリー大丈夫です。ラージヒープフラグメンテーションは未解決の問題です。

主なアプリケーションの制御下で画像がなくなってから再起動するまで、または64ビットに移動するまで、画像に作用する別のプロセスを開くことです(断片化の問題が起こりにくくなります) 。ビットマップ画像は、これは1つのチャンク内に大量のメモリを必要とするピクチャ

に代入されたとき

例外が貫通します。それらの画像について教えてください。彼らはどれくらいの大きさですか?なぜpicturebox(バッチ処理は通常、画像を見る必要はありません)。なぜなら、これは明白な問題であり、画像が大きければそれが期待されます。

+0

1つのイメージサイズは1MB(ビットマップイメージ) –

+0

あなたは1MBのメモリを意味しますか?メモリサイズは? 1MBのメモリに問題はありません。ディスク上の1MBのイメージは、数百万MBのメモリになる可能性があり、その後、脆弱性の問題にぶつかります。問題の例については、http://connect.microsoft.com/VisualStudio/feedback/details/521147/large-object-heap-fragmentation-causes-outofmemoryexceptionを参照してください。 – TomTom

関連する問題