私は画像でいくつかの操作を行うforeachループを持っています。このコードを50以上の画像で実行すると、OutOfMemoryException
が表示されていました。画像インスタンスはそれぞれ15MB以上であるためです。ガベージコレクタがforeachループで遅すぎますか?
var files = Directory.GetFiles(path).ToList();
foreach (var file in files)
{
Image image = new Bitmap(file);
//Do some operations
}
メインロジックを削除しましたが、これはこのコードにこの問題が残っているためです。 foreachループにGC.Collect();
を追加すると、問題はなくなり、例外は発生しません。
私の質問は、Collect
メソッドを呼び出さずにガベージコレクタが不要になったイメージをクリーンアップするには時間がかかりすぎるのですか、それとも他に何か不足していますか?
以前はこの問題に気付かなかった。 //Do some operations
の部分が各画像に対して〜1秒必要なので、問題はないと私は考えなかった。私が思ったガベージコレクターのための十分な時間でなければなりません。
がうまくあなたが本当に選択肢がありません。あまりにも遅いのはどういう意味ですか? –
@PaulFは重複していません。 OPは何かを尋ねています –
@YvetteColomb:私はそれが重複しているかのように見えます - OPはビットマップを使用するときにメモリ不足の問題を抱えています - GCはアンマネージメモリを自動的に処理しないためです。与えられた解決策がその質問に答えます。以下のRomanoの答えも見てください。 – PaulF