2012-02-09 3 views
0

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

+0

Какая функция генерирует ошибку? – Gabe

+0

исключение пройдет, когда растровое изображение присваивает картинке –

+1

Вы никогда не должны использовать GC.Collect() .., особенно не в циклах. Это может вызвать проблемы, модернизировать все ваши поколения объектов и просто делает GC бесполезным вообще. Это даже может вызвать проблему ... См. Другие решения, указанные ниже, и удалите метод сбора –

ответ

0

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

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

Ищите утечки памяти. Вы можете использовать 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.

1

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

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

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

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

+0

один размер изображения 1MB (растровое изображение) –

+0

Вы имеете в виду 1mb в памяти или на диске? Каков размер памяти? 1 мб в памяти не проблема, изображение размером 1 мб на диске может составлять сотни мб в памяти, а затем вы сталкиваетесь с проблемой фрагментации. Проверьте пример http://connect.microsoft.com/VisualStudio/feedback/details/521147/large-object-heap-fragmentation-causes-outofmemoryexception для примера проблемы. – TomTom

Смежные вопросы