Увеличить память для приложения (EOutOfMemory)
От: indee  
Дата: 15.10.14 15:59
Оценка:
Программа (написанная на Delphi) создает большое количество объектов. Иногда это приводит к Out of memory (EOutOfMemory).
Можно ли в Windows выделить больше памяти для выполнения приложения?

Спасибо!
Re: Увеличить память для приложения (EOutOfMemory)
От: glh Россия  
Дата: 15.10.14 17:33
Оценка: 16 (2)
Здравствуйте, indee, Вы писали:

I>Программа (написанная на Delphi) создает большое количество объектов. Иногда это приводит к Out of memory (EOutOfMemory).

I>Можно ли в Windows выделить больше памяти для выполнения приложения?

Ваше приложение съело всю доступную память?
На моей памяти я видел такое 2 раза, и оба, незадачливый программист кодер, грузил огромную таблицу в DevExpress Grid.

В порядке предпочтения осмелюсь предложить.
1) Перепишите логику работы.
2) Задействуйте другой менеджер памяти, с более подходящей для вас стратегией.
3) Переделайте для 64 разрядов.
4) http://bit.ly/ZE1d3S

К прочтению:
Архитектура памяти в Windows
Архитектура памяти в Windows (spin-off)
Адресное пространство под микроскопом

Manager Location
HeapAlloc-based memory manager http://cc.embarcadero.com/Item.aspx?id=22668
PSD Memory Manager (based on RecyclerMM ) http://dennishomepage.gugs-cats.dk/memoryManagerChallenge.htm
RecyclerMM http://glscene.sourceforge.net/RecyclerMM.htm
NexusDB http://www.nexusdb.com/
MultiMM http://cc.embarcadero.com/Item.aspx?id=14283
FastMM http://sourceforge.net/projects/fastmm/
FastSharemem http://www.thejobpage.com/emil/codexterity/fastsharemem.htm
ProcessMemMgr http://home.foni.net/~winter/delphi-bits/PrcMemMgr.zip
qmem http://www.torry.net/vcl/vcltools/debug/qmemory.zip, http://www.ussr.to/Russia/delphiplus/downloads/library/qmem.zip
HPMemMgr http://www.optimalcode.com/memmgr.htm, http://codecentral.borland.com/codecentral/snippets/14283.zip
SapMM https://code.google.com/p/sapmm/
scalemm http://code.google.com/p/scalemm/
SynScaleMM http://blog.synopse.info/post/2010/12/04/SynScaleMM
SafeMM http://cc.embarcadero.com/item/27241
PS. Претензии по ссылкам не принимаются, все были актуальны на момент сохранения.
Успехов!
C уважением, Алексей.
------------------------------------------------
Хороших %s не бывает — бывает не худший вариант.
delphi memory manager
Re: Увеличить память для приложения (EOutOfMemory)
От: RainBoy  
Дата: 29.10.14 20:12
Оценка:
{$SETPEFLAGS $0020} // IMAGE_FILE_LARGE_ADDRESS_AWARE = $0020;

http://cc.embarcadero.com/item/24309

В моей практике реально понадобилось 1 раз, когда сторонняя DLL кушала > 1.7 Gb памяти.
... << RSDN@Home 2.2.0 alpha 5 rev. 0>>
Re: Увеличить память для приложения (EOutOfMemory)
От: jhfrek Россия  
Дата: 29.10.14 20:22
Оценка:
Здравствуйте, indee, Вы писали:

I>Программа (написанная на Delphi) создает большое количество объектов. Иногда это приводит к Out of memory (EOutOfMemory).


если количество объектов реально большое и они реально нужны, их надо кэшировать в собственном менеджере памяти, потому как дельфийский можно действительно переполнить за счет сегментации
Re[2]: Увеличить память для приложения (EOutOfMemory)
От: indee  
Дата: 30.10.14 08:48
Оценка:
Здравствуйте, jhfrek, Вы писали:

J>Здравствуйте, indee, Вы писали:


I>>Программа (написанная на Delphi) создает большое количество объектов. Иногда это приводит к Out of memory (EOutOfMemory).


J>если количество объектов реально большое и они реально нужны, их надо кэшировать в собственном менеджере памяти...


Можно подробнее?
Спасибо!
Re[3]: Увеличить память для приложения (EOutOfMemory)
От: Danchik Украина  
Дата: 30.10.14 10:39
Оценка:
Здравствуйте, indee, Вы писали:

I>Здравствуйте, jhfrek, Вы писали:


J>>Здравствуйте, indee, Вы писали:


I>>>Программа (написанная на Delphi) создает большое количество объектов. Иногда это приводит к Out of memory (EOutOfMemory).


J>>если количество объектов реально большое и они реально нужны, их надо кэшировать в собственном менеджере памяти...


I>Можно подробнее?

I>Спасибо!

Попробуйте менеджеры памяти котрые вам описывали выше. Еще рано писать свой.
Re[3]: Увеличить память для приложения (EOutOfMemory)
От: glh Россия  
Дата: 30.10.14 16:21
Оценка:
Здравствуйте, indee, Вы писали:

I>Можно подробнее?


Я бы все же начал с ответа на вопросы:
Почему? (создается так много объектов)
Зачем? (они все нужны, прямо сейчас, одновременно)

Не зря предложение изменить логику работы идет первым.

Это самый интенсивный способ.
Остальные или отодвигают проблему на потом или решают ее количественно.

Игровые миры содержат огромное количество объектов-полигонов. Однако работают.
Текстовые редакторы редактируют огромные тексты пользуясь небольшим буфером.
Во времена DOS, а там существенные ограничения на память были, 16 бит все-таки, обрабатывали массивы данных ну никак не помещавшиеся в ОЗУ, вытесняли не используемые страницы на диск.
Успехов!
C уважением, Алексей.
------------------------------------------------
Хороших %s не бывает — бывает не худший вариант.
Re[3]: Увеличить память для приложения (EOutOfMemory)
От: jhfrek Россия  
Дата: 30.10.14 20:13
Оценка:
Здравствуйте, indee, Вы писали:

J>>если количество объектов реально большое и они реально нужны, их надо кэшировать в собственном менеджере памяти...

I>Можно подробнее?

к примеру

код где цепочка циклов символизирует глубокую вложенность процедуры где очень много раз выделяется память
for i := 1 to 10000000 do
  for j := 1 to 1000000 do
    ...
      for k := 0 ro 100000 do begin
        getmem(sizeof(integer))
        ....
        freemem()
      end


меняем на array of pointer := getmem(sizeof(integer) * большое число), а вместо getmem(), freemem() пишем inc/dec (указатель на свободное место в массиве)

ЗЫ. видел код где Assign производился через последовательность object.Free; object.CreateCopy(newObject). Банальный рефакторинг сильно уменьшил нагрузку на менеджер памяти. Так что я бы сильно поанализировал, прежде чем заниматься оптимизацией менеджера.
ЗЗЫ. Еще встречал когда динамические массивы в цикле мучили SetLength(array, Length(array) + 1)...
Re: Увеличить память для приложения (EOutOfMemory)
От: indee  
Дата: 16.12.14 09:25
Оценка:
Здравствуйте, indee, Вы писали:

I>Программа (написанная на Delphi) создает большое количество объектов. Иногда это приводит к Out of memory (EOutOfMemory).

I>Можно ли в Windows выделить больше памяти для выполнения приложения?

I>Спасибо!


OS Windows XP, 4GB RAM, Task Manager показывает, что использовано 60% памяти, приложение съело не более 250MB и Out of memory (EOutOfMemory)...
Почему не доступна для приложения оставшаяся свободная память Windows?
Re[2]: Увеличить память для приложения (EOutOfMemory)
От: BlackEric http://black-eric.lj.ru
Дата: 16.12.14 14:17
Оценка:
Здравствуйте, indee, Вы писали:

I>OS Windows XP, 4GB RAM, Task Manager показывает, что использовано 60% памяти, приложение съело не более 250MB и Out of memory (EOutOfMemory)...

I>Почему не доступна для приложения оставшаяся свободная память Windows?

Возможно, ему нужен большой непрерывный кусок
https://github.com/BlackEric001
Re[2]: Увеличить память для приложения (EOutOfMemory)
От: indee  
Дата: 17.12.14 08:17
Оценка:
Здравствуйте, glh, Вы писали:

glh>Здравствуйте, indee, Вы писали:


I>>Программа (написанная на Delphi) создает большое количество объектов. Иногда это приводит к Out of memory (EOutOfMemory).

I>>Можно ли в Windows выделить больше памяти для выполнения приложения?

glh>Ваше приложение съело всю доступную память?


Я был бы рад, если приложение съест всю доступную память...
Re[3]: Увеличить память для приложения (EOutOfMemory)
От: BlackEric http://black-eric.lj.ru
Дата: 17.12.14 09:12
Оценка:
Здравствуйте, indee, Вы писали:

I>Здравствуйте, glh, Вы писали:


glh>>Здравствуйте, indee, Вы писали:


I>>>Программа (написанная на Delphi) создает большое количество объектов. Иногда это приводит к Out of memory (EOutOfMemory).

I>>>Можно ли в Windows выделить больше памяти для выполнения приложения?

glh>>Ваше приложение съело всю доступную память?


I>Я был бы рад, если приложение съест всю доступную память...


Какой делфи и менеджер памяти?
https://github.com/BlackEric001
Re[2]: Увеличить память для приложения (EOutOfMemory)
От: jhfrek Россия  
Дата: 17.12.14 09:16
Оценка:
Здравствуйте, indee, Вы писали:

I>OS Windows XP, 4GB RAM, Task Manager показывает, что использовано 60% памяти, приложение съело не более 250MB и Out of memory (EOutOfMemory)...

I>Почему не доступна для приложения оставшаяся свободная память Windows?

попробуйте тупо прописать fastmm и посмотрите что получится
Re[2]: Увеличить память для приложения (EOutOfMemory)
От: Dimonka Верблюд  
Дата: 17.12.14 12:09
Оценка:
Здравствуйте, indee, Вы писали:

I>OS Windows XP, 4GB RAM, Task Manager показывает, что использовано 60% памяти, приложение съело не более 250MB и Out of memory (EOutOfMemory)...


250 мб — это совсем не много. Дело в чём-то другом. Попробуй создать лог создания/уничтожения и посмотри что создаётся и от чего падает.
Re[4]: Увеличить память для приложения (EOutOfMemory)
От: indee  
Дата: 17.12.14 12:55
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Здравствуйте, indee, Вы писали:


I>>Здравствуйте, glh, Вы писали:


glh>>>Здравствуйте, indee, Вы писали:


I>>>>Программа (написанная на Delphi) создает большое количество объектов. Иногда это приводит к Out of memory (EOutOfMemory).

I>>>>Можно ли в Windows выделить больше памяти для выполнения приложения?

glh>>>Ваше приложение съело всю доступную память?


I>>Я был бы рад, если приложение съест всю доступную память...


BE>Какой делфи и менеджер памяти?


Delphi 7, менеджер памяти по умолчанию (Borland MM?)
Re[3]: Увеличить память для приложения (EOutOfMemory)
От: indee  
Дата: 17.12.14 13:45
Оценка:
Здравствуйте, Dimonka, Вы писали:

D>Здравствуйте, indee, Вы писали:


I>>OS Windows XP, 4GB RAM, Task Manager показывает, что использовано 60% памяти, приложение съело не более 250MB и Out of memory (EOutOfMemory)...


D>250 мб — это совсем не много. Дело в чём-то другом. Попробуй создать лог создания/уничтожения и посмотри что создаётся и от чего падает.


Проверял, построчно проверял утечку создания/уничтожения — все не очень плохо.
Плохо то, что я не могу создать большое кол-во "жирных" обjектов.

Зачем покупать 4Gb на WinXP32, если при 1Gb все так же валится, не зависимо от объема свободной памяти.
Re[5]: Увеличить память для приложения (EOutOfMemory)
От: BlackEric http://black-eric.lj.ru
Дата: 17.12.14 14:34
Оценка:
Здравствуйте, indee, Вы писали:

BE>>Какой делфи и менеджер памяти?


I>Delphi 7, менеджер памяти по умолчанию (Borland MM?)


Ему нужна непрерывная память для выделения. Попробуйте использовать FastMM.
Или выделяйте при старте память с запасом, а потом работайте с этим участком
https://github.com/BlackEric001
Re[4]: Увеличить память для приложения (EOutOfMemory)
От: Dimonka Верблюд  
Дата: 17.12.14 15:03
Оценка:
Здравствуйте, indee, Вы писали:

I>Проверял, построчно проверял утечку создания/уничтожения — все не очень плохо.

I>Плохо то, что я не могу создать большое кол-во "жирных" обjектов.

Может тогда скажешь что за обьекты? Может другие идеи появятся как помочь?
"Жирные обьекты" можно разбивать на несколько менее жирных, либо проецировать в memory mapped files.
Re[6]: Увеличить память для приложения (EOutOfMemory)
От: indee  
Дата: 03.01.15 08:49
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Здравствуйте, indee, Вы писали:


BE>>>Какой делфи и менеджер памяти?


I>>Delphi 7, менеджер памяти по умолчанию (Borland MM?)


BE>Ему нужна непрерывная память для выделения. Попробуйте использовать FastMM.

BE>Или выделяйте при старте память с запасом, а потом работайте с этим участком

Спасибо за совет!

С FastMM все работает гараздо лучше, там где приложение ело 200Мб, сейчас всего 8Мб.
Re[7]: Увеличить память для приложения (EOutOfMemory)
От: vladislav_somov Россия  
Дата: 25.01.15 21:26
Оценка:
Здравствуйте, indee, Вы писали:

I>Здравствуйте, BlackEric, Вы писали:


BE>>Здравствуйте, indee, Вы писали:


BE>>>>Какой делфи и менеджер памяти?


I>>>Delphi 7, менеджер памяти по умолчанию (Borland MM?)


BE>>Ему нужна непрерывная память для выделения. Попробуйте использовать FastMM.

BE>>Или выделяйте при старте память с запасом, а потом работайте с этим участком

I>Спасибо за совет!


I>С FastMM все работает гараздо лучше, там где приложение ело 200Мб, сейчас всего 8Мб.


Я бы все же посоветовал взглянуть на архитектуру под другим углом. FastMM, в данном случае, — это "лечение симптомов", а не решение проблемы. Если при этом Вы не самостоятельно работаете активно с памятью, то, возможно, работаете, например, со стоками или с классом TStringList (возможно, неявно).
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.