![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Out of memory,
vps © (2009-02-19 21:45:00)Delphi 7, моя программа.
Несколько глобально объявленных массивов, процедура изменяет размер этих массивов и дописывает в них данные.(поиск файлов, ввод их данных в массивы)
программа работает, я смотрю по диспетчеру задач - занимаемая программой память увеличивается и как только моя программа отъедает 500 мегабайт памяти возникает ошибка out of memory. оперативки много и она далеко не кончается, остаётся ещё 2 гига при такой ошибке.
как быть, как позволить в Delphi своей программе занимать больше 500 мегабайт памяти?
Sapersky (2009-02-20 15:25:00) [1]Вечные дельфийские грабли, раз в 2-3 месяца кто-нибудь да наступит...
Решения:
1) Менеджер памяти FastMM, там перевыделение блоками встроено непосредственно в ReAllocMem/SetLength.
2) TList
3) http://sapersky.narod.ru/files/Arrays.rar
4) Что-нибудь самописное
Плохиш (2009-02-20 10:54:00) [2]
> скажите ещё - как же тогда правильно постепенно увеличивать
> занимаемую динамическим массивом память?
Блоками, пример можно посмотреть в реализации TList.
MBo (2009-02-20 09:50:00) [3]Если есть предположения о размере данных - сразу отвести нужное количество памяти. Иначе - увеличивать размер на значительное количество , или, скажем, в два раза.
vps (2009-02-20 09:28:00) [4]надо же))
замерил - 400 мегабайт программа занимала после 30000 добавлений в массив(столько файлов находило). сделал сразу размер массивов 30000 элементов, так программа стала занимать в 20 раз меньше памяти - 16 мегабайт и время работы раза в 3 меньше.
использовал стандартный метод увеличения размера массива - setlength, а тут такое!
по теме ветки ответ я получил, спасибо,
скажите ещё - как же тогда правильно постепенно увеличивать занимаемую динамическим массивом память?
MBo (2009-02-20 08:52:00) [5]>в процессе работы изменяется их размер - длина+1, длина+1 - в этом случае дефрагментации же не будет?
Будет! Это наихудший способ.
vps (2009-02-20 08:27:00) [6]Amoeba ©
массивов всего три и в процессе работы изменяется их размер - длина+1, длина+1 - в этом случае дефрагментации же не будет?
>все
Спасибо за указание на не верность логики и прочее,
это действительно важно, но сейчас я столкнулся
с другой проблемой и хочу знать как её решать - свободная память есть, а моя программа занять её не может.
Единственное что я знаю про возможные причины - переменные объявленные локально(например в процедуре нажатия кнопки) имеют ограничение на размер занимаемой памяти. но у меня то переменные глобально объявлены!
Германн (2009-02-20 00:12:00) [7]
> Несколько глобально объявленных массивов, процедура изменяет
> размер этих массивов и дописывает в них данные.(поиск файлов,
> ввод их данных в массивы)
И нафига всё это держать постоянно в памяти? А винчестер на что?
Riply (2009-02-20 00:09:00) [8]> [4] Сергей М. © (19.02.09 23:30)
>> KilkennyCat
> Отдувайся, кот, сам)
Что ж ты товарища в беде бросаешь ? :)
> [3] vps (19.02.09 23:28)
> пробовал менять - не получается, останавливается и всё
Пересматривай логику программы.
Правда, тебе на это уже намекали, да ты совет offtopic-ом обозвал :)
Amoeba (2009-02-20 00:04:00) [9]
> Несколько глобально объявленных массивов, процедура изменяет
> размер этих массивов и дописывает в них данные
Многократное увеличение размера динамических массивов? Если так, то происходит жуткая фрагментация памяти, и в результате не остается свободного непрерывного участка память для под новый массив. В общем сам виноват, поскольку нельзя так делать.
Данная проблема, и как делать правильно, не столь давно разбиралось в конференции.
Сергей М. (2009-02-19 23:30:00) [10]
> KilkennyCat
Отдувайся, кот, сам)
Я устал.
vps (2009-02-19 23:28:00) [11]KilkennyCat
проект - опции - memory sizes?
пробовал менять - не получается, останавливается и всё
Сергей М. ©
offtopic
Сергей М. (2009-02-19 23:18:00) [12]
> моя программа отъедает 500 мегабайт
Ну и нафих такая обжора нужна ?
ты не задумывался ли, нашиша тебе такой объем ?
KilkennyCat (2009-02-19 23:15:00) [13]Указать требуемое в свойствах проекта. Но это всеравно не беспредельно.
А ошибка на самом деле в другом - крайне неверный подход. Ужель о базах данных нет ни малейших познаний?