Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.11.29;
Скачать: [xml.tar.bz2];

Вниз

Сработало исключение 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.005 c
15-1254472377
@!!ex
2009-10-02 12:32
2009.11.29
Как работает Hamachi?


1-1210408735
fender2008
2008-05-10 12:38
2009.11.29
C++ DLL


15-1254227405
istok20
2009-09-29 16:30
2009.11.29
WiMax...


1-1227031341
IgorT
2008-11-18 21:02
2009.11.29
Не могу открыть 5-мбайтный ини файл с помощью - TMemIniFile


1-1226591844
lorin
2008-11-13 18:57
2009.11.29
Выключение компа





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский