Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

memory allocation failed

32K
18 июля 2008 года
JihN
13 / / 11.05.2008
Доброго времени суток. Извините, если тема немного несоответствует разделу, но не знаю, куда бы она лучше подошла..
У меня возникла следующая интересная проблема.
В проекте для генерации базы, используются сторонние программы, написанные на C++ в Visual C++ 6.0. Исходных кодов этих программ нет.
Эти программы генерируют конечный детерминированный автомат из файла, который содержит слова. Всё было хорошо, пока слов было не много (~400к), однако при увеличении до ~1.5м слов, одна из программ стала вылетать, выдавая ошибку "memory allocation failed".
Дизассемблировав exe'шник, выяснил, что данную ошибку могут выдавать ф-и malloc, calloc и realloc. Те, программе не хвататет размера кучи(heap'а). Попробовал увеличить размер свопа - не помогло. Открыл task manager и посмотрел, как используется память при работе этой программы.. 2Гб памяти(всё, что есть) съедаются полностью, вместе со свопом, съедается около 3Гб.
Первое разумное решение - добавить оперативной памяти, но сейчас это вряд ли удастся.
Вопрос такой, есть ли программы, способы, с помощью которых можно заставить конкретную программу работать с жёстким диском вместо кучи? Не важно, что упадёт производительность.
Или, может быть, подскажите другие варианты решения этой проблемы?
Заранее спасибо.
11
18 июля 2008 года
oxotnik333
2.9K / / 03.08.2007
отрубить руки по самую жо... разработчикам...
2 гигов не хватает :eek:
5
18 июля 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: JihN
Открыл task manager и посмотрел, как используется память при работе этой программы.. 2Гб памяти(всё, что есть) съедаются полностью, вместе со свопом, съедается около 3Гб.


Ну хм, если версии программ - 32битные, то увеличение количества ОЗУ не поможет - адресное пространство кончилось, под виндами более 3Гб "в одни руки" (процессу) не дают.

Цитата: JihN
Или, может быть, подскажите другие варианты решения этой проблемы?

Вариант пожалуй самый жестокий - пересмотреть алгоритмы работы программ.

32K
18 июля 2008 года
JihN
13 / / 11.05.2008
Цитата: hardcase
Ну хм, если версии программ - 32битные, то увеличение количества ОЗУ не поможет - адресное пространство кончилось, под виндами более 3Гб "в одни руки" (процессу) не дают.


да, 32битные.. совсем забыл про размер адресного пространства..

Цитата: hardcase
Вариант пожалуй самый жестокий - пересмотреть алгоритмы работы программ.


да, об этом думал изначально, но проблема в том, что нет алгоритма (общие принципы работы я понмимаю, но конкретной реализации нет) и нет исходников..

11
18 июля 2008 года
oxotnik333
2.9K / / 03.08.2007
можно попробовать написать некий сервис который будет находить это приложение и каждую, допустим секунду (милисекунду) сбрасывать ему память:
SetProcessWorkingSetSize(hWnd, -1, -1);
32K
18 июля 2008 года
JihN
13 / / 11.05.2008
Цитата: oxotnik333
можно попробовать написать некий сервис который будет находить это приложение и каждую, допустим секунду (милисекунду) сбрасывать ему память:
SetProcessWorkingSetSize(hWnd, -1, -1);


боюсь, не получится, поскольку память, по-идее, не простаивает, а в ней что-то хранится и это что-то может понадобиться позднее.

кстати, а память для стека выделяется в куче?
появилась мысль о том, что может быть глубокая рекурсия и попросту не зватает памяти для стека..
хотя проблема остаётся та же..

5
18 июля 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: JihN
кстати, а память для стека выделяется в куче?

Нет. В классике стек растет навстречу куче. К тому же он обычно сильно ограничен (4Мб кажется по дефолту). Но стек объемом в 10 и более мегабайтов заполнить можно только при наличи рекурсии с матрицами архибольшого объема, выделяющимися на стеке. У вас бы в таком случае Stack overflow вываливался а не сообщение о нехватке памяти.

11
18 июля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: JihN
боюсь, не получится, поскольку память, по-идее, не простаивает, а в ней что-то хранится и это что-то может понадобиться позднее.


Эта ф-ция сбрасывает зарезирвированную системой память, которая не используется, так что в любом случае вред она не нанесет (сам проверял)

2.5K
21 июля 2008 года
OpenMind
10 / / 11.07.2005
Тоже столкнулся с проблемой утечек памяти. Разрабатываю приложение под Windows 2k/XP, обрабатывающее данные в буфере небольшого размера, при этом выделение и освобождение памяти происходит часто.

Первоначально работа с памятью строилась на функциях HeapAlloc и HeapFree. Была замечена странная утечка памяти. При периодическом выделении/освобождении 8 Кб памяти, она составляла от 4 до 120 Кб. Нормальное освобождение всей занятой памяти, разумеется, происходило только при закрытии приложения. Такое ощущение, что вызов функции HeapFree фактически не освобождал память, выделенную из кучи HeapAlloc.

Проблему решил, путем использования функций VirtualAlloc и VirtualFree, работающих не с кучей (heap), а с виртуальной памятью. При этом сократился и объем самого приложения, и утечек не происходит.

На сколько я знаю, функции malloc, realloc, free и пр. под Windows используют все те же HeapAlloc, HeapReAlloc и HeapFree. Возможно проблема именно в этом.
14
21 июля 2008 года
Phodopus
3.3K / / 19.06.2008
Цитата: OpenMind
Возможно проблема именно в этом.



Тогда это решается сервиспаком к винде, хотя ошибочных реализаций HeapFree по Knowledge Base что-то не видно..
Скорей всего программист забыл написать где-то delete, в таком случае придется разбираться с алгоритмом и вставлять его самостоятельно. Но когда разберешься проще будет самому переписать :)

32K
23 июля 2008 года
JihN
13 / / 11.05.2008
2All
всем спасибо за участие в дискуссии. проблема была решена, но совершенно иным способом. нашёл аналог этих программок для линукса, установил на виртуальную машину линух, задал ему 4гб оперативы и 2гб свопа =)
запустил, долго думало, но работу сделало..
по поводу ваших предложений. перепробовал всё, кроме
Цитата: oxotnik333
можно попробовать написать некий сервис который будет находить это приложение и каждую, допустим секунду (милисекунду) сбрасывать ему память:
SetProcessWorkingSetSize(hWnd, -1, -1);


поскольку не было времени, но возьму на заметку и как-нть напишу демончика =)

11
23 июля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: JihN

поскольку не было времени, но возьму на заметку и как-нть напишу демончика =)


могу скинуть (для себя писал) прогу которая бегает по всем процессам и скидывает у всех память :)

32K
23 июля 2008 года
JihN
13 / / 11.05.2008
Цитата: oxotnik333
могу скинуть (для себя писал) прогу которая бегает по всем процессам и скидывает у всех память :)



о! было бы очень здорово =)
тока ты с исходниками кидай, интересно =)
jihn[ррр!]tut.by

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог