Доброго времени суток. Извините, если тема немного несоответствует разделу, но не знаю, куда бы она лучше подошла..
У меня возникла следующая интересная проблема.
В проекте для генерации базы, используются сторонние программы, написанные на C++ в Visual C++ 6.0. Исходных кодов
этих программ нет.
Эти программы генерируют конечный детерминированный автомат из файла, который содержит слова. Всё было хорошо, пока
слов было не много (~400к), однако при увеличении до ~1.5м слов, одна из программ стала вылетать, выдавая ошибку
"memory allocation failed".
Дизассемблировав exe'шник, выяснил, что данную ошибку могут выдавать ф-и malloc, calloc и realloc. Те, программе не
хвататет размера кучи(heap'а). Попробовал увеличить размер свопа — не помогло. Открыл task manager и посмотрел, как
используется память при работе этой программы.. 2Гб памяти(всё, что есть) съедаются полностью, вместе со свопом,
съедается около 3Гб.
Первое разумное решение — добавить оперативной памяти, но сейчас это вряд ли удастся.
Вопрос такой, есть ли программы, способы, с помощью которых можно заставить конкретную программу работать с жёстким
диском вместо кучи? Не важно, что упадёт производительность.
Или, может быть, подскажите другие варианты решения этой проблемы?
Размер адресного пространства в 32битной винде — 2Гб, т.е. больше 2Гб мапяти ты юзать не сможешь, даже если физически ее будет больше. В вин 2003 можно это значение увеличить до 3Гб.
Как вариант, распаралелить работу с данными, разнеся ее на несколько процессов. Тогда каждый запущенный процес сможет юзать по 2Гб адресного пространства.
Если съедается все адресное пространство (2 или 3 Гб) и приложения
32-битные, то вряд ли что-то можно сделать. На 64-битной винде адресного
пространства будет больше, но 32-битных приложений это не касается. Однако
для одного приложения доступной памяти может быть больше, так что можно
попробовать — сделать виртуальной памяти гигов на 6.