Форум: "Начинающим";
Текущий архив: 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