![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сработало исключение EOutOfMemory: как оптимизировать память? [D7, XP]
yantux © (2009-10-12 10:31:00)Во время выполнения программы сработало исключение EOutOfMemory.
Полагаю это благодаря активному использованию памяти с помощью безразмерных массивов, длина которых задаётся с помощью setlength();
Постоянно сообщения, что у виндоуса мало виртуальной памяти.
Как можно оптимизировать, уменьшить использование памяти, чтобы программа после использования памяти возращала её системе?
yantux (2009-10-14 14:26:00) [1]> Finalize(z)
спасибо
clickmaker (2009-10-14 10:29:00) [2]> Можно ли турнуть менеджер памяти, что бы после setlength(z,
> 0) он возвращал всю память ОС?
Finalize(z)
brother (2009-10-14 06:43:00) [3]> Разве Штирлиц был сантехником?
он был разведчиком) как и автор)
Плохиш (2009-10-13 13:40:00) [4]
> Вретес ведь, Штирлиц....
Разве Штирлиц был сантехником?
Dennis I. Komarov (2009-10-13 12:34:00) [5]
> Я прекрасно это понимаю, поэтому не испоьзую указателей,
> объектов и прочее в нутри рекода.
Вретес ведь, Штирлиц....
sniknik (2009-10-13 12:33:00) [6]> Я прекрасно это понимаю, поэтому не испоьзую указателей, объектов и прочее в нутри рекода.
и думаешь исходя из твоего понимания компилятор будет работать по другому? а переключатель у него телапатический, для тех кто понимает и использует один код, понимает и не использует другой, не понимает но использует третий и т.д. ... смешно.
> Можно ли турнуть менеджер памяти, что бы после setlength(z,0) он возвращал всю память ОС?
повторение мать учения... можно, но партизанам это не нужно.
RWolf (2009-10-13 12:01:00) [7]
> т.е. если я использую setlength, то менеджер памяти будет
> всё грести под себя, а если я буду использовать new, dispose,
> то я смогу освобождать память и честно возвращать ОС?
Смотря как использовать.
Пример. Вот ты выделил мегабайтный массив, и сразу за ним что-то положил менеджер. Занято — метр с лишним.
Далее ты задал массиву длину 0. Получилась метровая дыра в памяти, управляемой менеджером. Занято — опять же метр с лишним.
Если сразу же задать массиву прежнюю длину, он разместится в том же месте, и памяти займётся не больше прежнего. Если хоть на байт больше — поимеем уже два с лишним метра занятой памяти. Если менеджер перед этим успел что-то ещё разместить в свободном месте — в него не поместится и прежний мегабайтный массив.
Если размещаешь/освобождаешь в куче сам, то избегаешь таких ситуаций.
> о если идти таким путём, то как снежный ком в С++ начнуть
> плодиться ошибки утечки памяти
Утечки в С++ плодятся не просто из-за ручного выделения/освобождения, это чересчур просто (хотя и бывает), а из-за того, что оно хитро прячется за перегрузками операторов, передачами по ссылке, копированию объектов и ещё тысяче мелочей; в общем — из-за злоупотреблением чрезмерной сложностью языка.
yantux (2009-10-13 11:48:00) [8]> да проблема-то просто решается.
> выделяй большие блоки памяти на куче, мимо дельфового менеджера
>памяти, чтобы он не захламлял своими автоматическими размещениями
>непрерывное адресное пространство, необходимое алгоритму.
т.е. если я использую setlength, то менеджер памяти будет всё грести под себя, а если я буду использовать new, dispose, то я смогу освобождать память и честно возвращать ОС? Но если идти таким путём, то как снежный ком в С++ начнуть плодиться ошибки утечки памяти. Хотелось бы этого избежать.
Можно ли турнуть менеджер памяти, что бы после setlength(z,0) он возвращал всю память ОС?
yantux (2009-10-13 11:44:00) [9]> (есть ссылки, указатели, есть передачи по не типизированным указателям, >где только программист и может знать что по ним "лежит"), в общем если >ты на-создавал в своих рекордах каких то объектов, ссылок, а после >освобождаеш только "внешнее", то "внутреннее" за тебя компилятор >освобождать даже не попытается...
Я прекрасно это понимаю, поэтому не испоьзую указателей, объектов и прочее в нутри рекода.
RWolf (2009-10-13 11:06:00) [10]да проблема-то просто решается.
выделяй большие блоки памяти на куче, мимо дельфового менеджера памяти, чтобы он не захламлял своими автоматическими размещениями непрерывное адресное пространство, необходимое алгоритму.
sniknik (2009-10-13 10:58:00) [11]> Со своей точки зрения программиста не вижу разницы, т.е. я надеюсь что эти отличия изолированы от меня.
это точка зрения НЕ программиста...
можешь ссылаться на разные скриптовые языки, где более полная изоляция, но она сделана за счет чего то - меньшей производительности кода, больших ограничений самого программиста, отсутствия независимой от интерпретатора программы, за счет того что учишь ты там не работу системы, а работу прикладной программы которой по сути является скриптовый интерпретатор... ну и что что управляешь ты им с помощью чего то очень похожего на компилируемый язык, сути это не меняет.
в компилируемых не так, там часто НЕВОЗМОЖНО отследить чего и где на-создал программист (есть ссылки, указатели, есть передачи по не типизированным указателям, где только программист и может знать что по ним "лежит"), в общем если ты на-создавал в своих рекордах каких то объектов, ссылок, а после освобождаеш только "внешнее", то "внутреннее" за тебя компилятор освобождать даже не попытается... (мало ли где ты на эти объекты еще ссылаешься), изолировать это от ПРОГРАММИСТА можно только запретив... если тебе это не нравится то ВАЛИ с дельфи, это не твое...
> это проблема ОС.
виноваты все кроме тебя естественно, это так по ламерски...
Inovet (2009-10-13 10:42:00) [12]> [59] yantux © (13.10.09 10:34)
> > ты кого обманываешь? сам себя... работа с массивом чисел
> и массивом >рекордов (про которые речь в начале), очень
> сильно различается.
>
> Со своей точки зрения программиста не вижу разницы, т.е.
> я надеюсь что эти отличия изолированы от меня.
Ты хочешь, чтоб тебе указали на ошибку не видя эту рекорд?
Inovet (2009-10-13 10:40:00) [13]> [59] yantux © (13.10.09 10:34)
> >выделение;
> >try
> > что-то делаешь;
> >finally
> > освобождение;
>
> Можно и так, но почему не ползоваться setlength() ? Чем
> он хуже?
Хотя бы потому, что одно дело функция, и другое механизм языка.
yantux (2009-10-13 10:34:00) [14]> ты кого обманываешь? сам себя... работа с массивом чисел и массивом >рекордов (про которые речь в начале), очень сильно различается.
Со своей точки зрения программиста не вижу разницы, т.е. я надеюсь что эти отличия изолированы от меня.
>Длину ты изменил до 0, но ты пользуешься библиотекой и если не сам >явно, то откуда гарантия, что в ней не произошло фрагментации. Да и >вообще что за фобия выделять и освобождать по человечески.
>
>выделение;
>try
> что-то делаешь;
>finally
> освобождение;
Можно и так, но почему не ползоваться setlength() ? Чем он хуже?
>Я, персонально, думаю, что выделять массивы размером в несколько >миллионов элементов нужно очень редко, почти никогда.
>
>Еще я думаю, с учетом: «растровые фотки их обработка», что для сабжа >вообще не нужно выделять всю память сразу, а можно подгружать фотки и >удалять ненужные (не видимые?) по мере надобности.
Не охота тратить время на ввод/вывод, тем более, если это тормозная флешка или cd. Загрузил, обработал, сохранил - так быстрее.
>Кстати, даже если менеджер памяти отдаст её ОС, то это не значит, что >она станет доступна для других процессов.
Это уже не касается моей программы, это проблема ОС.
MonoLife (2009-10-13 06:50:00) [15]yantux © (12.10.09 10:51) [7]
> но как описана a ?
record
yantux © (12.10.09 10:54) [10]
> или мы должны гдать размер одного элемента... ибо 100 непонятно чего жрет 240 мб оперативы?
растровые фотки их обработка
что-то я не увидел у автора сабжа где и как загружаются и освобождаются в record "фотки".. всё про массив integer твердит.. ей богу, "партизанен"))
С логикой проектирования тоже как-то подозрительно, как сказал Kolan © (12.10.09 15:47) [51]
brother (2009-10-13 04:36:00) [16]я ему еще в [12] все ответил...
Стенка (2009-10-12 19:49:00) [17]Уже не выдержала. Лоб оказался крепче.
Dennis I. Komarov (2009-10-12 16:52:00) [18]Во человек - пол сотни постов, а показать что в массиве...
Боюсь стенка лба не выдержит...
Inovet (2009-10-12 16:00:00) [19]> [49] yantux © (12.10.09 15:44)
> 2. в этом случае устойчиво срабатывает исключение на проверку
> выхода за границе массива, соответсвующую галочку поставил
> в опциях компилятора
Длину ты изменил до 0, но ты пользуешься библиотекой и если не сам явно, то откуда гарантия, что в ней не произошло фрагментации. Да и вообще что за фобия выделять и освобождать по человечески.
выделение;
try
что-то делаешь;
finally
освобождение;
Стенка (2009-10-12 15:58:00) [20]> А то, что чел дефрагментируетпамять, не возвращая все взятое, это особенность чела.
фрагментирует