выделить более 1 ГБ памяти на 32-битной XP - PullRequest
10 голосов
/ 20 марта 2012

Я столкнулся со странной проблемой, мой процесс не может выделить больше, чем кажется, что немного ниже 1 ГиБ.Столбец диспетчера задач Windows «Использование памяти» показывает значения, близкие к 1 ГиБ, когда мое программное обеспечение выдает исключение bad_alloc.Да, я проверил, что значение, переданное для выделения памяти, является разумным.(нет расы / коррупции, которая бы провалилась).Да, мне нужна вся эта память, и нет никакого способа обойти это.(Это буфер для изображений, которые не могут быть сжаты в дальнейшем)

Я не пытаюсь выделить всю 1 ГБ памяти за один раз, там несколько выделений около 300 МБ каждый.Это вызовет проблемы?(Я постараюсь выяснить, работает ли более небольшое выделение ресурсов лучше).Есть какой-то переключатель компилятора или что-то еще, что я должен установить, чтобы пройти 1 ГиБ?Я видел, как другие жаловались на ограничение в 2 ГиБ, что было бы хорошо для меня .. Мне просто нужно немного больше :).Я использую VS 2005 с пакетом обновления 1 (SP1), и я запускаю его на 32-битной XP, и это на C ++.

Ответы [ 5 ]

11 голосов
/ 20 марта 2012

В 32-разрядной ОС процесс имеет адресное пространство 4 ГБ. всего .

. В Windows половина этого объема запрещена, поэтому ваш процесс имеет 2 ГБ.

Это 2 ГБ непрерывной памяти.Но это становится фрагментированным.Ваш исполняемый файл загружается по одному адресу, каждая DLL загружается по другому адресу, затем есть стек, выделения кучи и так далее.Таким образом, хотя ваш процесс, вероятно, имеет достаточно свободного адресного пространства, нет непрерывных блоков, достаточно больших для выполнения ваших запросов памяти.Таким образом, выделение меньших ресурсов, вероятно, решит эту проблему.

Если ваше приложение скомпилировано с флагом LARGEADDRESSAWARE, ему будет разрешено использовать столько же оставшихся 2 ГБ, сколько может сэкономить Windows.(И значение этого зависит от вашей платформы и среды.

  • для 32-разрядного кода, работающего на 64-разрядной ОС, вы получите полное 4-ГБ адресное пространство
  • для 32-битного кода, работающего на 32-битной ОС без переключателя загрузки / 3GB, флаг вообще ничего не значит
  • для 32-битного кода, работающего на 32-битной ОС с загрузкой / 3GBЕсли вы переключитесь, вы получите 3 ГБ адресного пространства.

На самом деле, установка флага - это всегда хорошая идея, если ваше приложение может с ним справиться (это в основном флаг возможностей. Он сообщает Windows, что мы можем обрабатывать больше памяти, поэтому, если Windows тоже может, она должна просто пойти дальше и предоставить нам как можно больше адресного пространства), но вы, вероятно, не можете полагаться на то, что это даст эффект.на 64-битной ОС маловероятно, что вы будете много покупать. (Требуется переключатель загрузки / 3GB, и известно, что он вызывает проблемы с драйверами, особенно с видеодрайверами)

4 голосов
/ 20 марта 2012

Выделение больших кусков непрерывной памяти всегда является проблемой. Очень вероятно получить больше памяти меньшими порциями

Вы должны перепроектировать свои структуры памяти.

2 голосов
/ 20 марта 2012

Вы правы, подозревая большие ассигнования в 300 МБ. Ваш процесс сможет получить около 2 ГБ (3, если вы используете переключатель / 3GB boot.ini и флаг ссылки LARGEADDRESSAWARE), но не как большой непрерывный блок.

Типичные решения для этого - разбить запросы на фрагменты или полосы фиксированного размера (скажем, 256x256x4 байта) и написать промежуточный класс, чтобы скрыть эту деталь представления.

Вы можете быстро проверить это, написав небольшой цикл выделения, который выделяет блоки разных размеров.

1 голос
/ 04 июля 2013

Вы также можете проверить эту функцию из MSDN. 1ГБ звонит отсюда:

Этот параметр должен быть больше или равен 13 страницам (например, 53 248 в системах с размером страницы 4K) и меньше, чем в масштабе всей системы максимум (количество доступных страниц минус 512 страниц). Размер по умолчанию 345 страниц (например, это 1 413 120 байт в системах с Размер страницы 4K).

Здесь они упомянули, что максимальное допустимое количество страниц для процесса составляет 345 страниц, что чуть больше 1 ГБ.

0 голосов
/ 20 марта 2012

Когда у меня есть несколько больших выделений, подобных этому, я использую функцию Windows VirtualAlloc, чтобы избежать выделения распределителя по умолчанию.

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

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