Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1234350269
dmitry1208197320
2009-02-11 14:04
2009.04.12
Как сделать в компоненте TTreeView элемент списка выделенным


15-1234428505
Bless
2009-02-12 11:48
2009.04.12
Вопрос шахматистам.


15-1234338924
Дмитрий С
2009-02-11 10:55
2009.04.12
Изменение прав доступа NTFS через какой либо COM obj.


15-1234215001
Юрий
2009-02-10 00:30
2009.04.12
С днем рождения ! 10 февраля 2009 вторник


15-1233663867
Кто б сомневался
2009-02-03 15:24
2009.04.12
Юмористические шоу





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский