Получение OutofMemoryException во время выполнения с сообщением «Недостаточно памяти для продолжения выполнения программы» - PullRequest
1 голос
/ 05 августа 2010

Я получаю OutofMemoryException во время выполнения с сообщением «Недостаточно памяти для продолжения выполнения программы.».Я загружаю изображения в начале программы.Каждое изображение размером более 50 МБ.Если размер изображения превышает 277 МБ, я получаю это исключение.Я загружаю изображения сразу, потому что я должен отобразить их эскизы при запуске.

Я думал о решении для кэширования и подкачки.У меня есть возможность использовать больше памяти системы или как-то другое решение.

Спасибо

Ответы [ 2 ]

3 голосов
/ 05 августа 2010

Есть ли возможность использовать больше памяти системы или как-то другое решение.

Переключение на 64-битную версию является единственным простым вариантом.

Существует базовое ограничение .NET для каждого объекта в 1 ГБ (также относится к 64-битной версии), но это не ваша проблема.Для создания объекта .NET должно быть достаточно непрерывной свободной памяти в процессе.Если у вас есть несколько очень больших (> 250 МБ) крупных объектов, становится все менее вероятным, что будет доступно непрерывное адресное пространство.

Опции:

  • Использовать несколько процессов имежпроцессное взаимодействие - со всей дополнительной сложностью, которая приносит (особенно в случаях сбоя).
  • Загрузка только одного изображения за раз.
  • 64bit.

Также естьПрочитайте статью «Внутренние компоненты Windows» о том, как Windows управляет памятью, а затем о том, как .NET GC управляет памятью в фоновом режиме.Не будет никакой замены для того, чтобы знать, что происходит, когда вы перемещаете так много данных.(Такие инструменты, как VMMap , помогут, но только если у вас есть общее представление о том, как все это работает.)

1 голос
/ 05 августа 2010

Возможно, вы могли бы попытаться разрешить вашей программе доступ к большему количеству памяти, но это будет проблемой.Для приложения .NET объем памяти контролируется параметром processModel / memoryLimit в файле machine.config.Microsoft рекомендует установить его не более 60%.

Однако вы загружаете 50+ МБ изображений одновременно для отображения миниатюр (которые, вероятно, имеют небольшой размер).Я полагаю, что именно здесь вы вносите свои изменения.Вы можете загрузить свои изображения одно за другим, затем создать миниатюру и сразу же освободить память.

В любом случае наличие 50 МБ + изображений неэффективно, когда вы пытаетесь показать миниатюру.Разве вы не можете просто сохранить эскизы и не создавать их каждый раз?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...