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

Вниз

Сработало исключение EOutOfMemory: как оптимизировать память?   Найти похожие ветки 

 
yantux ©   (2009-10-12 10:31) [0]

Во время выполнения программы сработало исключение EOutOfMemory.
Полагаю это благодаря активному использованию памяти с помощью безразмерных массивов, длина которых задаётся с помощью setlength();

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


 
brother ©   (2009-10-12 10:35) [1]

без бутылки не поймешь, код нужен...


 
RWolf ©   (2009-10-12 10:36) [2]

Программа на D7 самодеятельностью в плане выделения памяти не занимается, ищите утечку.


 
brother ©   (2009-10-12 10:37) [3]

имхо не утечка там, а реально много выделено)


 
yantux ©   (2009-10-12 10:43) [4]

Я использую только безразмерный массив и setlength() для его инициализации, ни каких malloc() и им подобных.

Я так понимаю, если делаю setlength(a,100), то программа запросит у ОС память на сто элементов.

Как можно заставить программу возвращать память ОС? Если я сделаю setlength(a,1), то программа вернёт ОС память, которую занимали 99 эелементов?

У меня 256Мб, ХР, D7.


 
brother ©   (2009-10-12 10:48) [5]

> Если я сделаю setlength(a,1), то программа вернёт ОС память,
> которую занимали 99 эелементов?

да


 
brother ©   (2009-10-12 10:48) [6]

> setlength(a,100),

но как описана a ?


 
yantux ©   (2009-10-12 10:51) [7]

> но как описана a ?

record


 
brother ©   (2009-10-12 10:51) [8]

ты партизан?
полностью описание рекорда приведи


 
brother ©   (2009-10-12 10:52) [9]

или мы должны гдать размер одного элемента... ибо 100 непонятно чего жрет 240 мб оперативы?


 
yantux ©   (2009-10-12 10:54) [10]

> или мы должны гдать размер одного элемента... ибо 100 непонятно чего жрет 240 мб оперативы?

растровые фотки их обработка


 
brother ©   (2009-10-12 10:54) [11]

если хочешь партизанить - не получишь ответ на сабж...


 
brother ©   (2009-10-12 10:55) [12]

ошибка в 17 строке, мой вердикт пока...


 
yantux ©   (2009-10-12 11:04) [13]

> если хочешь партизанить - не получишь ответ на сабж...

Вопрос не в том, чтобы вы нашли ошибку, спасибо за помощь, но я её сам найду. Вопрос в том, КАК заставить программу возращать память. В Java есть сборщик мусора, который сам, без учатия программиста возвращает память системе. С С++ всё нужно прописывать вручную. В Delphi я новичёк.

Нельзя в Delphi автоматизировать возвращение памяти ОС? Например поставить галочку в опциях компиляции или надо везде вручную прописывать setlength(a,1), чтобы программа возвращала память ОС? Ибо кроме setlength() я ни чего не использую для выделения памяти.


 
RWolf ©   (2009-10-12 11:09) [14]

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


 
Dennis I. Komarov ©   (2009-10-12 11:25) [15]


> yantux ©   (12.10.09 10:51) [7]
> > но как описана a ?
>
> record

Сдается мне, что указатель там где-то...


 
DrPass ©   (2009-10-12 11:57) [16]


> brother ©   (12.10.09 10:48) [5]
> > Если я сделаю setlength(a,1), то программа вернёт ОС память,
>
> > которую занимали 99 эелементов?
>
> да

Нет. Она их вернет своему менеджеру памяти. Менеджер памяти совершенно не обязательно побежит срочно их возвращать ОС.


 
yantux ©   (2009-10-12 12:55) [17]

> Нет. Она их вернет своему менеджеру памяти. Менеджер памяти совершенно не обязательно побежит срочно их возвращать ОС.

Замечательно. Допустим я делаю:
setlength(a,100);//выделяю память
setlength(a,1);//отдаю менеджеры памяти
setlength(b,100);// ! в этом месте менеджер памяти будет выделять памяьб из своих ресурсов или запросит у ОС?

Есть ли функйции, опции компилятора, которые влияли бы на работу менеджера памяти?


 
Стенка   (2009-10-12 13:01) [18]

А есть ли функции, опции компилятора, которые влияли бы на работу программиста, размещающего объекты в рекордах?


 
sniknik ©   (2009-10-12 13:03) [19]

> setlength(b,100);// ! в этом месте менеджер памяти будет выделять памяьб из своих ресурсов или запросит у ОС?
из своих.

вообще ты зря ищешь утечки в дельфевском менеджере, ищи в своем коде как советовали.

> Есть ли функйции, опции компилятора, которые влияли бы на работу менеджера памяти?
есть, но партизанам они не нужны.


 
Сергей М. ©   (2009-10-12 13:07) [20]


> в этом месте менеджер памяти будет выделять памяьб из своих
> ресурсов


Из своих.


 
Плохиш ©   (2009-10-12 13:47) [21]

Ахтунг, партизанен. Вешать, вешать и вешать...


 
Плохиш ©   (2009-10-12 13:49) [22]


> yantux ©   (12.10.09 10:51) [7]
>
> > но как описана a ?
>
> record

Или приводишь его описание, код работы с элементами массива, или иди слесари дальше.


 
yantux ©   (2009-10-12 14:07) [23]

> Сдается мне, что указатель там где-то...

Я вообще не использую указателей. Не хочу заморачиваться с malloc и free, именно по этой причине я использую setlength.


 
yantux ©   (2009-10-12 14:10) [24]

> имхо не утечка там, а реально много выделено)

Я так понимаю утечки могут возникать, если вызывать malloc, new и не вовремя delete, free. Я этим не пользуюсь. Только setlength


 
yantux ©   (2009-10-12 14:12) [25]

> вообще ты зря ищешь утечки в дельфевском менеджере, ищи в своем коде как советовали.

Я не ищу утечек, поскольку я не использую malloc, new. Правильно ли я понимаю, что для оптимального использования памяти мне достаточно вовремя вызывать setlength(a,1) ?


 
Стенка   (2009-10-12 14:14) [26]

> КАК заставить программу возращать память?

Вопрос поставлен неверно. Надо так:
КАК заставить программиста вернуть память, занятую изображениями?

Ответить на этот вопрос без кода НЕВОЗМОЖНО.


 
Стенка   (2009-10-12 14:16) [27]

> yantux ©   (12.10.09 14:12) [25]
> Правильно ли я понимаю, что ...

Нет


 
yantux ©   (2009-10-12 14:18) [28]

> есть, но партизанам они не нужны.

Какие проблемы могут помочь решать эти функции? Они влияют на работу setlength? Я в своём проекте поставил почти  все галочки в опциях компилятора. Насколько я понял, только в этом случае делфийный компилятор нормально отлавливает мои ошибки и помогает писать более надёжную программу с точки зрения стабильности работы.


 
Игорь Шевченко ©   (2009-10-12 14:22) [29]

На абстрактный код тебе дали абстрактный ответ - [12]


 
yantux ©   (2009-10-12 14:25) [30]

> КАК заставить программиста вернуть память, занятую изображениями?
> Ответить на этот вопрос без кода НЕВОЗМОЖНО.

var
a, b : array of integer; (* создаю безразмерный массив *)
begin
setlength(a,1000000); (* выделяем память *)

...
(* пользуюсь массивом a *)
...

setlength(a,1); (* этого достаточно для освобождения памяти? *)

(* сколько памяти запросит менеджер памяти  у ОС?
будет ли МП использовать загашник в 1Мб? *)
setlength(b,2000000);

end;


 
Inovet ©   (2009-10-12 14:31) [31]

> [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 для массива нужен непрерывный, если такой найдётся, то не будет.


 
Kolan ©   (2009-10-12 14:37) [32]

>setlength(a,1); (* этого достаточно для освобождения памяти? *)
Странно что не setlength(a,0);

Я бы посоветовал вам воспользоваться списком (лучше списком объектов TObjectList, чтобы совсем не парится с памятью). Дело в том, что для массива нужен непрерывный кусок памяти, а список распихивается в любое свободное место.


 
Стенка   (2009-10-12 14:40) [33]

Это
> yantux ©   (12.10.09 10:54) [10]
> растровые фотки их обработка

противоречит этому
> yantux ©   (12.10.09 14:25) [30]
> a, b : array of integer;


 
yantux ©   (2009-10-12 14:42) [34]

> Кусок в 2000000 для массива нужен непрерывный, если такой найдётся, то не будет.

а если так?

var
   a1, a2, b : array of integer; (* создаю безразмерный массив *)
begin
setlength(a1,500000); (* выделяем память *)
setlength(a2,500000); (* выделяем память *)

...
(* пользуюсь массивом a1, a2 *)
...

setlength(a1,1); (* этого достаточно для освобождения памяти? *)
setlength(a2,1); (* этого достаточно для освобождения памяти? *)

(* сколько памяти запросит менеджер памяти  у ОС?
будет ли МП использовать загашник два блока по 500000? *)
setlength(b,1000000);

end;

делает ли менеджер памяти аля дефрагментацию, объединение нескольких свободных блоков памяти в один?


 
Kolan ©   (2009-10-12 14:44) [35]

Я бы не рассчитывал на работу менеджера памяти, непонятно зачем такие здоровые куски нужны в виде массивов.


 
Стенка   (2009-10-12 14:45) [36]

> yantux ©   (12.10.09 14:42) [34]

Менеджер памяти все делает наилучшим образом для array of integer,
но это не твой случай


 
yantux ©   (2009-10-12 14:45) [37]

> Я бы посоветовал вам воспользоваться списком (лучше списком объектов TObjectList, чтобы совсем не парится с памятью). Дело в том, что для массива нужен непрерывный кусок памяти, а список распихивается в любое свободное место.

ок, спасибо, буду копать


 
yantux ©   (2009-10-12 14:47) [38]

> Я бы не рассчитывал на работу менеджера памяти, непонятно зачем такие здоровые куски нужны в виде массивов.

Почему нельзя расчитывать на МП? В чём проблема?


 
yantux ©   (2009-10-12 14:48) [39]

> противоречит этому

мне так удобно


 
Стенка   (2009-10-12 14:49) [40]

Ты победил



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

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

Наверх




Память: 0.56 MB
Время: 0.012 c
15-1254656776
Denis__
2009-10-04 15:46
2009.11.29
настройки модема D-Link 2500U


15-1254244818
tesseract
2009-09-29 21:20
2009.11.29
литература по posix


2-1255588723
Маркабес
2009-10-15 10:38
2009.11.29
Как составить SQL запрос в жоские условия ?


8-1201199790
Степан
2008-01-24 21:36
2009.11.29
Доступ к звуку при записи


1-1226314117
lod
2008-11-10 13:48
2009.11.29
Ошибка