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