![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сработало исключение EOutOfMemory: как оптимизировать память? [D7, XP]
yantux © (2009-10-12 10:31:00)Во время выполнения программы сработало исключение EOutOfMemory.
Полагаю это благодаря активному использованию памяти с помощью безразмерных массивов, длина которых задаётся с помощью setlength();
Постоянно сообщения, что у виндоуса мало виртуальной памяти.
Как можно оптимизировать, уменьшить использование памяти, чтобы программа после использования памяти возращала её системе?
Kolan (2009-10-12 14:37:00) [41]>setlength(a,1); (* этого достаточно для освобождения памяти? *)
Странно что не setlength(a, 0);
Я бы посоветовал вам воспользоваться списком (лучше списком объектов TObjectList, чтобы совсем не парится с памятью). Дело в том, что для массива нужен непрерывный кусок памяти, а список распихивается в любое свободное место.
Inovet (2009-10-12 14:31:00) [42]> [30] yantux © (12.10.09 14:25)
> > КАК заставить программиста вернуть память, занятую изображениями?
>
> > Ответить на этот вопрос без кода НЕВОЗМОЖНО.
>
> var
> a, b : array of integer; (* создаю безразмерный массив *)
>
> begin
> setlength(a,1000000); (* выделяем память *)
>
> ...
> (* пользуюсь массивом a *)
> ...
>
> setlength(a,1); (* этого достаточно для освобождения памяти?
> *)
>
> (* сколько памяти запросит менеджер памяти у ОС?
> будет ли МП использовать загашник в 1Мб? *)
> setlength(b,2000000);
>
> end;
Кусок в 2000000 для массива нужен непрерывный, если такой найдётся, то не будет.
yantux (2009-10-12 14:25:00) [43]> КАК заставить программиста вернуть память, занятую изображениями?
> Ответить на этот вопрос без кода НЕВОЗМОЖНО.
var
a, b : array of integer; (* создаю безразмерный массив *)
begin
setlength(a,1000000); (* выделяем память *)
...
(* пользуюсь массивом a *)
...
setlength(a,1); (* этого достаточно для освобождения памяти? *)
(* сколько памяти запросит менеджер памяти у ОС?
будет ли МП использовать загашник в 1Мб? *)
setlength(b,2000000);
end;
Игорь Шевченко (2009-10-12 14:22:00) [44]На абстрактный код тебе дали абстрактный ответ - [12]
yantux (2009-10-12 14:18:00) [45]> есть, но партизанам они не нужны.
Какие проблемы могут помочь решать эти функции? Они влияют на работу setlength? Я в своём проекте поставил почти все галочки в опциях компилятора. Насколько я понял, только в этом случае делфийный компилятор нормально отлавливает мои ошибки и помогает писать более надёжную программу с точки зрения стабильности работы.
Стенка (2009-10-12 14:16:00) [46]> yantux © (12.10.09 14:12) [25]
> Правильно ли я понимаю, что ...
Нет
Стенка (2009-10-12 14:14:00) [47]> КАК заставить программу возращать память?
Вопрос поставлен неверно. Надо так:
КАК заставить программиста вернуть память, занятую изображениями?
Ответить на этот вопрос без кода НЕВОЗМОЖНО.
yantux (2009-10-12 14:12:00) [48]> вообще ты зря ищешь утечки в дельфевском менеджере, ищи в своем коде как советовали.
Я не ищу утечек, поскольку я не использую malloc, new. Правильно ли я понимаю, что для оптимального использования памяти мне достаточно вовремя вызывать setlength(a,1) ?
yantux (2009-10-12 14:10:00) [49]> имхо не утечка там, а реально много выделено)
Я так понимаю утечки могут возникать, если вызывать malloc, new и не вовремя delete, free. Я этим не пользуюсь. Только setlength
yantux (2009-10-12 14:07:00) [50]> Сдается мне, что указатель там где-то...
Я вообще не использую указателей. Не хочу заморачиваться с malloc и free, именно по этой причине я использую setlength.
Плохиш (2009-10-12 13:49:00) [51]
> yantux © (12.10.09 10:51) [7]
>
> > но как описана a ?
>
> record
Или приводишь его описание, код работы с элементами массива, или иди слесари дальше.
Плохиш (2009-10-12 13:47:00) [52]Ахтунг, партизанен. Вешать, вешать и вешать...
Сергей М. (2009-10-12 13:07:00) [53]
> в этом месте менеджер памяти будет выделять памяьб из своих
> ресурсов
Из своих.
sniknik (2009-10-12 13:03:00) [54]> setlength(b,100);// ! в этом месте менеджер памяти будет выделять памяьб из своих ресурсов или запросит у ОС?
из своих.
вообще ты зря ищешь утечки в дельфевском менеджере, ищи в своем коде как советовали.
> Есть ли функйции, опции компилятора, которые влияли бы на работу менеджера памяти?
есть, но партизанам они не нужны.
Стенка (2009-10-12 13:01:00) [55]А есть ли функции, опции компилятора, которые влияли бы на работу программиста, размещающего объекты в рекордах?
yantux (2009-10-12 12:55:00) [56]> Нет. Она их вернет своему менеджеру памяти. Менеджер памяти совершенно не обязательно побежит срочно их возвращать ОС.
Замечательно. Допустим я делаю:
setlength(a,100);//выделяю память
setlength(a,1);//отдаю менеджеры памяти
setlength(b,100);// ! в этом месте менеджер памяти будет выделять памяьб из своих ресурсов или запросит у ОС?
Есть ли функйции, опции компилятора, которые влияли бы на работу менеджера памяти?
DrPass (2009-10-12 11:57:00) [57]
> brother © (12.10.09 10:48) [5]
> > Если я сделаю setlength(a,1), то программа вернёт ОС память,
>
> > которую занимали 99 эелементов?
>
> да
Нет. Она их вернет своему менеджеру памяти. Менеджер памяти совершенно не обязательно побежит срочно их возвращать ОС.
Dennis I. Komarov (2009-10-12 11:25:00) [58]
> yantux © (12.10.09 10:51) [7]
> > но как описана a ?
>
> record
Сдается мне, что указатель там где-то...
RWolf (2009-10-12 11:09:00) [59]Повторюсь, в D7 нет сборщика мусора, вся выделенная компилятором память честно возвращается при выходе за пределы видимости переменной. Мусорить может только сам программист — неосвобождением памяти, которую сам выделил на куче.
yantux (2009-10-12 11:04:00) [60]> если хочешь партизанить - не получишь ответ на сабж...
Вопрос не в том, чтобы вы нашли ошибку, спасибо за помощь, но я её сам найду. Вопрос в том, КАК заставить программу возращать память. В Java есть сборщик мусора, который сам, без учатия программиста возвращает память системе. С С++ всё нужно прописывать вручную. В Delphi я новичёк.
Нельзя в Delphi автоматизировать возвращение памяти ОС? Например поставить галочку в опциях компиляции или надо везде вручную прописывать setlength(a,1), чтобы программа возвращала память ОС? Ибо кроме setlength() я ни чего не использую для выделения памяти.