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

Вниз

Как побороть EOutOfMemory ?   Найти похожие ветки 

 
val_5 ©   (2004-05-05 22:16) [0]

Как побороть EOutOfMemory ?
Увеличить файл подкачки в ОС. Или в Project_Options.Linker увеличить стэк. Или еще как ?


 
Gero ©   (2004-05-05 22:17) [1]

Купить больше оперативки.


 
Algol   (2004-05-05 22:20) [2]


> Как побороть EOutOfMemory ?


Оптимизировать алгоритм работы с данными ;)


 
tesseract ©   (2004-05-06 17:17) [3]

Поскать утечки памяти в программе. Если это БД то всё ясно - такая прорва таблиц в памяти висеть остаётся.

Так-что если это твой случай не вырубайся в дельфу по f2 - проверено, помогает.


 
val_5 ©   (2004-05-06 21:43) [4]

To tesseract:
 Что может означать фраза "не вырубайся в дельфу по f2" ?

To All:
Ошибка происходит при SetLength(Arr, Length(Arr) + 1). На этот момент в массиве уже порядка 700000 элементов. Массив двумерный, элемент массива это record ~70байт. Вообще идет работа с несколькими массивами. Поставил размер файла подкачки 4Гб, оперативки 500Мб. Но во время выполнения в диспетчере задач видно что программа использует менее 200Мб памяти, есть запас оперативки и виртуальной памяти - но происходит вылет по EOutOfMemory ?! Почему ОС не выделяет память до упора ? ( На испытательном сроке дали внедрять это гавно(до меня это лепили 5 человек и бросали) Вообще это расчет оптимальных маршрутов развозки заказов. Утечек памяти нет, просто просчитывается такое огромное количество вариантов развозки)


 
Vlad ©   (2004-05-06 21:53) [5]


> val_5 ©   (06.05.04 21:43) [4]

Может Packed Record спасет ? Или использование TList вместо массива.


 
Palladin ©   (2004-05-06 21:53) [6]

какой то неоптимальный расчет оптимальных маршрутов

пилите шура пилите :)


 
Palladin ©   (2004-05-06 21:55) [7]


> Vlad ©   (06.05.04 21:53) [5]

TList сам использует динмассив... так что к 70 байтам прибавится еще 4, а Packed Record скажется на производительности...
тут принцип работы с данными менять надо...


 
Vlad ©   (2004-05-06 22:01) [8]

Да, лучше конечно менять принцип.
Я не знаю что за задача такая, но судя по всему там должна использоваться БД, так что есть ли смысл использовать массивы, может проще SQL запросами все вычисления производить ?


 
Vlad ©   (2004-05-06 22:08) [9]


> Palladin ©   (06.05.04 21:55) [7]

Кстати, сейчас глянул, а TList вроде статический массив использует


 
panov ©   (2004-05-06 22:17) [10]

Попробуй работать с FileMapping. Возможно поможет.


 
Palladin ©   (2004-05-06 22:20) [11]

Он использует ^array[0.. ] of и естественно происходит reallocmem при вставке элемента, практически тоже что и динмассив, только без счетчика ссылок. Те же принципы.


 
val_5 ©   (2004-05-06 23:30) [12]

Можно провести эксперимент - в бесконечном цикле наращивать динамический массив. EOutOfMemory выскочит ТОЛЬКО тогда когда будет использован весь файл подкачки. Это видно в диспетчере задач. В той же программе EOutOfMemory происходит когда есть место в файле подкачки и даже метров 150 в физической памяти. Если устранить причину почему ОС не выделяет имеющуюся память - проблема будет решена.


 
Mim1 ©   (2004-05-07 00:08) [13]

val_5 ©   (06.05.04 23:30) [12]

ИМХО Система не выделяет достаточно пямти по той причине, что размер свободной памяти меньше размера требуемой. То есть если свободно 400мб а требуется 500 системе совсем не обязательно занимать 400 для того чтобы ругнуться.

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


 
Algol   (2004-05-07 00:09) [14]


> val_5 ©   (06.05.04 23:30) [12]


Да я тебе и так могу сказать причину:
Когда ты вызываешь вот это SetLength(Arr, Length(Arr) + 1), у тебя происходит не просто добавление одного элемента к массиву, а ВЕСЬ массив перемещается в другую область памяти, при чем под массив резервируется в два раза больше места чем его актуальная длина. Из-за этого расход памяти и происходит ))
Если хочешь использовать динамический массив, т старайся хотя бы заранее определить его размеры, будет работать намного эффективней.


 
Mim1 ©   (2004-05-07 00:09) [15]

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


 
Algol   (2004-05-07 00:21) [16]


> Mim1 ©   (07.05.04 00:09) [15]

Согласен, однако при работе со списками становится проблемой время доступа к данным .(


 
Mim1 ©   (2004-05-07 00:28) [17]

Algol   (07.05.04 00:21) [16]

Можно еще с бинарными деревьями пиограться.


 
Algol   (2004-05-07 00:43) [18]


> Можно еще с бинарными деревьями пиограться.


Ну для высокопроизводительных систем это наверно единственное решение и есть. (Только не обязательно бинарные, в n-арных скорость доступа выше).
Хотя, конечно, массив все равно быстрей.


 
Паниковский ©   (2004-05-07 06:31) [19]

может не используюмую часть на диск выгрузить а потом опять подкачать?


 
Mim1 ©   (2004-05-07 07:11) [20]

Algol   (07.05.04 00:43) [18]

ИМХО хоть скорость доступа в массиве и выше чаше всего n"ный элемент смысловой нагрузке не несет, то есть для работы нам требуется не элемент с определенным порядковым номером а элемент имеющий определенные аттрибуты. При таком подходе в активно используются циклы и т.п. Так что ситуация со списком равносильна массиву, а ситуация с доревом как раз и даст реальный прирост в производительности.
Однако пререход от  массива к списку не совсем легкая задача, придется несколько изменить свою логику.


 
WondeRu ©   (2004-05-07 08:16) [21]

>Паниковский ©   (07.05.04 06:31) [19]
>может не используюмую часть на диск выгрузить а потом опять подкачать?

угу, насосом для велосипеда! ;-)


 
Algol   (2004-05-07 09:53) [22]


> может не используюмую часть на диск выгрузить а потом опять
> подкачать?


Как вариант, можно предложить также динамическое сжатие данных. У меня есть довольно серьезная программа, работающая по таком принципу. При продуманном подходе бстродействие почти не страдает, зато расход памяти уменьшается в десятки раз.



Страницы: 1 вся ветка

Текущий архив: 2004.05.30;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.042 c
1-1084535167
WebErr
2004-05-14 15:46
2004.05.30
Create (override?)


1-1084695889
Максим
2004-05-16 12:24
2004.05.30
Курсор


1-1084781602
Vadim X
2004-05-17 12:13
2004.05.30
Как сбросить кэш?


3-1084362479
kalishenko
2004-05-12 15:47
2004.05.30
IbAPI


6-1081634875
OrbitAl
2004-04-11 02:07
2004.05.30
Простенький LAN-чат