Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сработало исключение EOutOfMemory: как оптимизировать память? [D7, XP]


Страницы:   1 2 3 4

yantux ©   (2009-10-12 10:31:00) 

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

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


Kolan   (2009-10-12 15:49:00) [21]

Кстати, даже если менеджер памяти отдаст её ОС, то это не значит, что она станет доступна для других процессов.


Kolan   (2009-10-12 15:47:00) [22]

Я, лично, считаю, что не надо наедятся на то, что у менеджера памяти что-то останется или не останется в загашнике.

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

Еще я думаю, с учетом: «растровые фотки их обработка», что для сабжа вообще не нужно выделять всю память сразу, а можно подгружать фотки и удалять ненужные (не видимые?) по мере надобности.


sniknik   (2009-10-12 15:46:00) [23]

> Я не ищу утечек, поскольку я не использую malloc, new.
ну и дура... (© Джентльмены удачи), какая разница как ты накрасишься, если под видом бабы все одно мужик?
...
procedure NotMalloc(...)
begin
 ... malloc(...)
end;

невозможная ситуация? а ты ВЕСЬ используемый код, не свой, а то что в нем используется, изучил... ну, ну.

>> Ответить на этот вопрос без кода НЕВОЗМОЖНО.
> var
> a, b : array of integer; (* создаю безразмерный массив *)
ты кого обманываешь? сам себя... работа с массивом чисел и массивом рекордов (про которые речь в начале), очень сильно различается.


yantux   (2009-10-12 15:44:00) [24]

> Ну допустим, что 2 * 5000000 не сразу отдаст ОС,
> 1. не факт что они расположены последовательно
> 2. после SetLength в 0 в эти куски что-то не прописалось тобой же самим.

Можно ли менеджер памяти заставить сразу отдавать ОС, чтобы он делал это автоматически?

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


yantux   (2009-10-12 15:41:00) [25]

> А то, что чел дефрагментирует память, не возвращая все взятое, это особенность чела.

Ни чего я не дефрагментирую, я даже не знаю, как это делать. Это java дефрагментирует, но программисту даже не надо об этом знать.


yantux   (2009-10-12 15:40:00) [26]

> Менеджер памяти сложная штука, разобраться в ней не так уж и просто. > Более того, алгоритмы запросто могут измениться. Поэтому полагаться на > его особенности опасно.

Да, но он придуман, чтобы упрощать работу программиста. В этом его полезное свойство. Тогда почему на него нельзя положиться?


Сергей М.   (2009-10-12 15:25:00) [27]


> будет ли МП использовать загашник два блока по 500000?


Не будет.
Этих блоков попросту нет - ты вернел назад не два по 500000, а два по 499999 элементов.

А даже если бы и вернул два по 500000, то не факт что они расположены  последовательно, что при запросе 1000000 элементов позволило бы менеджеру объединить их в один непрерывный блок.

Да и не может этоткод привести EOutOfMemory/


Стенка   (2009-10-12 15:20:00) [28]

> Inovet ©   (12.10.09 15:09) [44]

То, что автомобиль едет не является его особенностью. Вот если стоит - особенность.
То, что менеджер памяти выдает и освобождает память по запросу ровно столько, сколько запросили, - это не особенность, а нормальная работа.
А то, что чел дефрагментирует память, не возвращая все взятое, это особенность чела.


Inovet   (2009-10-12 15:09:00) [29]

> [42] Стенка   (12.10.09 14:59)
> Как страшно жить. Все мои программы на него полагаются.


> [41] Kolan ©   (12.10.09 14:55)
> на его особенности


Inovet   (2009-10-12 15:06:00) [30]

> [34] yantux ©   (12.10.09 14:42)
> а если так?

См

> [41] Kolan ©   (12.10.09 14:55)
> Менеджер памяти сложная штука, разобраться в ней не так
> уж и просто. Более того, алгоритмы запросто могут измениться.
> Поэтому полагаться на его особенности опасно.

Ну допустим, что 2 * 5000000 не сразу отдаст ОС,
1. не факт что они расположены последовательно
2. после SetLength в 0 в эти куски что-то не прописалось тобой же самим.


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

Как страшно жить. Все мои программы на него полагаются.


Kolan   (2009-10-12 14:55:00) [32]

Менеджер памяти сложная штука, разобраться в ней не так уж и просто. Более того, алгоритмы запросто могут измениться. Поэтому полагаться на его особенности опасно.


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

Ты победил


yantux   (2009-10-12 14:48:00) [34]

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

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


yantux   (2009-10-12 14:47:00) [35]

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

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


yantux   (2009-10-12 14:45:00) [36]

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

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


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

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

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


Kolan   (2009-10-12 14:44:00) [38]

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


yantux   (2009-10-12 14:42:00) [39]

> Кусок в 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;

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


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

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

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


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо