Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.04.12;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.009 c
9-1178359698
frame3
2007-05-05 14:08
2009.04.12
спрайты


2-1235327758
mm_ash
2009-02-22 21:35
2009.04.12
Dataset Buffers


15-1234359947
Ega23
2009-02-11 16:45
2009.04.12
А нужна ли конференция "Основная"?


15-1233903923
Кое кто
2009-02-06 10:05
2009.04.12
Реально ли перейти на бумажные пакеты?


9-1149382435
N.
2006-06-04 04:53
2009.04.12
Asphyre