![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сработало исключение EOutOfMemory: как оптимизировать память? [D7, XP]
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;