Как решить OutOfMemoryException в C # - PullRequest
0 голосов
/ 09 февраля 2012

Я работаю над проектом обработки изображений. В моем приложении я обрабатываю одно за другим изображения из папки (я обрабатываю изображения в цикле while), в папке содержится более 1000 изображений. Я использую сборщик мусора (GC. Collect ()) для каждых 4 изображений. как решить эту проблему после обработки 1000 изображений, получая OutOfMemoryException (исключение пройдет, когда растровое изображение назначается для ящика с картинками)?

Ответы [ 3 ]

1 голос
/ 09 февраля 2012

Не новость.Это нормально, чтобы получить эти исключения, не делая ничего плохого.Обработка большого кучи все еще остается нерешенной проблемой.

Ваш лучший шанс - открыть отдельный процесс, работающий с изображениями, пока он не закончится (затем перезапустить его) под управлением вашего основного приложения, и / или перейти к64 бита (большее пространство делает проблемы фрагментации менее вероятными).

исключение будет проходить, когда растровое изображение назначается для Picturebox

Для этого требуется много памятикусок.Расскажите нам об этих изображениях?Насколько они велики?Почему picturebox (при пакетной обработке обычно не нужно видеть изображение). Во всяком случае, это определенная проблема, и если изображения большие, этого следовало ожидать.

0 голосов
/ 09 февраля 2012

Ищите утечки памяти. Вы можете использовать WinDbg с командой gcroot. Смотрите ссылку ниже.

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.

0 голосов
/ 09 февраля 2012

Это зависит от того, как вы используете изображения. Скорее всего, вы не выбрасываете соответствующий экземпляр. Попробуйте обернуть ваши экземпляры в оператор using:

using (var image = ...new instance created...)
{
    // ...do stuff...
}
...