У меня есть следующая проблема (?):Из памяти проблемы на Win32 (по сравнению с Linux)
Программа запуска на компьютере ОС Windows (32-разрядная, 3.1Gb памяти, как VC++ 2008 и MinGW скомпилированный код) завершается с ошибкой bad_alloc
(после выделения около 1,2 ГБ, исключение возникает при попытке выделить вектор из 9 миллионов удвоений, т. е. около 75 МБ), при этом имеется достаточное количество ОЗУ (по крайней мере, согласно диспетчеру задач).
Те же программы, которые запускаются на машинах Linux (32-разрядная, 4 ГБ-памяти, 32-разрядная, 2 ГБ-память), отлично работают с максимальной памятью памяти около 1,6 ГБ. Интересно, что код win32, созданный mingw, запущенным на 4Gb-машине linux под вином, также терпит неудачу с bad_alloc, хотя и в другом (более позднем) месте, а затем при запуске под окнами ...
Каковы возможные проблемы?
- Куча фрагментации? (Как я могу это знать? Как это можно решить?)
- Куча коррупции? (Я запускаю код с включенным параметром pageheap.exe без сообщений об ошибках, реализованный векторный доступ с проверкой границ - снова нет ошибок, код по существу свободен от указателей, используются только
std::vector
s иstd::list
. Запуск программы под Valgrind (memcheck) потребляет слишком много памяти и заканчивается преждевременно, но не находит ошибок) - Недостаточно памяти ??? (Там должно быть достаточно памяти)
Кроме того, что может быть причиной того, что версия окна терпит неудачу в то время как версия Linux работает (и даже на машинах с меньшим объемом памяти)? (Также обратите внимание, что флаг линкера/LARGEADDRESSAWARE используется с VC + 2008, если это может иметь никакого эффекта)
Любые идеи были бы оценены, я в моем конце остроумия с этим ... :-(
Я заметил, что на самом деле я постоянно изменял размеры векторов, которые могут привести к фрагментации. Попытался это исправить, но он, похоже, не имеет желаемого эффекта, но я, возможно, что-то пропустил. Конечно, есть что-то для исследования (например, выход sysinternals). Вернусь, когда узнаю больше ... –
Оказывается, что фрагментация кучи была виновником. Я смог устранить большую часть изменения размера вектора. Однако проблема все еще оставалась, потому что построение большого (около 9 миллионов строк) вектора 'std :: list's немедленно приводило программу вниз. Я предполагаю, что мне придется реализовать пользовательский распределитель для списков (я об этом мало знаю) или переключиться на реализацию списков как массивы фиксированного размера (мои списки небольшие, поэтому я не потеряю много памяти) , Интересно, что при компиляции с помощью mingw программа теперь укладывается в 2GB, а с VC - нет. –