memory allocation failed
У меня возникла следующая интересная проблема.
В проекте для генерации базы, используются сторонние программы, написанные на C++ в Visual C++ 6.0. Исходных кодов этих программ нет.
Эти программы генерируют конечный детерминированный автомат из файла, который содержит слова. Всё было хорошо, пока слов было не много (~400к), однако при увеличении до ~1.5м слов, одна из программ стала вылетать, выдавая ошибку "memory allocation failed".
Дизассемблировав exe'шник, выяснил, что данную ошибку могут выдавать ф-и malloc, calloc и realloc. Те, программе не хвататет размера кучи(heap'а). Попробовал увеличить размер свопа - не помогло. Открыл task manager и посмотрел, как используется память при работе этой программы.. 2Гб памяти(всё, что есть) съедаются полностью, вместе со свопом, съедается около 3Гб.
Первое разумное решение - добавить оперативной памяти, но сейчас это вряд ли удастся.
Вопрос такой, есть ли программы, способы, с помощью которых можно заставить конкретную программу работать с жёстким диском вместо кучи? Не важно, что упадёт производительность.
Или, может быть, подскажите другие варианты решения этой проблемы?
Заранее спасибо.
2 гигов не хватает :eek:
Ну хм, если версии программ - 32битные, то увеличение количества ОЗУ не поможет - адресное пространство кончилось, под виндами более 3Гб "в одни руки" (процессу) не дают.
Вариант пожалуй самый жестокий - пересмотреть алгоритмы работы программ.
да, 32битные.. совсем забыл про размер адресного пространства..
да, об этом думал изначально, но проблема в том, что нет алгоритма (общие принципы работы я понмимаю, но конкретной реализации нет) и нет исходников..
SetProcessWorkingSetSize(hWnd, -1, -1);
SetProcessWorkingSetSize(hWnd, -1, -1);
боюсь, не получится, поскольку память, по-идее, не простаивает, а в ней что-то хранится и это что-то может понадобиться позднее.
кстати, а память для стека выделяется в куче?
появилась мысль о том, что может быть глубокая рекурсия и попросту не зватает памяти для стека..
хотя проблема остаётся та же..
Нет. В классике стек растет навстречу куче. К тому же он обычно сильно ограничен (4Мб кажется по дефолту). Но стек объемом в 10 и более мегабайтов заполнить можно только при наличи рекурсии с матрицами архибольшого объема, выделяющимися на стеке. У вас бы в таком случае Stack overflow вываливался а не сообщение о нехватке памяти.
Эта ф-ция сбрасывает зарезирвированную системой память, которая не используется, так что в любом случае вред она не нанесет (сам проверял)
Первоначально работа с памятью строилась на функциях HeapAlloc и HeapFree. Была замечена странная утечка памяти. При периодическом выделении/освобождении 8 Кб памяти, она составляла от 4 до 120 Кб. Нормальное освобождение всей занятой памяти, разумеется, происходило только при закрытии приложения. Такое ощущение, что вызов функции HeapFree фактически не освобождал память, выделенную из кучи HeapAlloc.
Проблему решил, путем использования функций VirtualAlloc и VirtualFree, работающих не с кучей (heap), а с виртуальной памятью. При этом сократился и объем самого приложения, и утечек не происходит.
На сколько я знаю, функции malloc, realloc, free и пр. под Windows используют все те же HeapAlloc, HeapReAlloc и HeapFree. Возможно проблема именно в этом.
Тогда это решается сервиспаком к винде, хотя ошибочных реализаций HeapFree по Knowledge Base что-то не видно..
Скорей всего программист забыл написать где-то delete, в таком случае придется разбираться с алгоритмом и вставлять его самостоятельно. Но когда разберешься проще будет самому переписать :)
всем спасибо за участие в дискуссии. проблема была решена, но совершенно иным способом. нашёл аналог этих программок для линукса, установил на виртуальную машину линух, задал ему 4гб оперативы и 2гб свопа =)
запустил, долго думало, но работу сделало..
по поводу ваших предложений. перепробовал всё, кроме
SetProcessWorkingSetSize(hWnd, -1, -1);
поскольку не было времени, но возьму на заметку и как-нть напишу демончика =)
поскольку не было времени, но возьму на заметку и как-нть напишу демончика =)
могу скинуть (для себя писал) прогу которая бегает по всем процессам и скидывает у всех память :)
о! было бы очень здорово =)
тока ты с исходниками кидай, интересно =)
jihn[ррр!]tut.by