delphi out of memory как исправить

Delphi out of memory как исправить

так дальше ищите утечки памяти!

Это вы создали объект (== выделили под него память). А где Вы освободили занимаемую им память?!

Попробую поискать утечку.

читайте из Stream по одной записи и будет вам счастье! (и код проще).
Вы все равно не читаете здесь из файла, а только переносите данные из одного места в памяти (буфер Stream) в другое (данные Dictionay) через третий фрагмент памяти (array).

Буферизация обычно вначале фиксирует размер буфера (а иногда и сами буфера).
Откажитесь от «бесконечных» setLength. Задайте размер раз и навсегда. И просто следите за тем какая часть массива заполнена. (учитывая предыдущее замечание оптимальный размер =1).

Но уж, в любом случае, нужно делать что-то одно, явно не стоит указателю, которому присвоен nil уже после присвоения вызывать процедуру выделения памяти с нулём!

UPDATE
Да, проверил в Delphi, действительно, присвоение указателю динамического массива nil освобождает занимаемую массивом память! Так что, в этом данном месте исходного кода ничего не должно приводить к утечками памяти..

читайте из Stream по одной записи и будет вам счастье! (и код проще).
Вы все равно не читаете здесь из файла, а только переносите данные из одного места в памяти (буфер Stream) в другое (данные Dictionay) через третий фрагмент памяти (array).

Буферизация обычно вначале фиксирует размер буфера (а иногда и сами буфера).
Откажитесь от «бесконечных» setLength. Задайте размер раз и навсегда. И просто следите за тем какая часть массива заполнена. (учитывая предыдущее замечание оптимальный размер =1).

Если честно, я всегда думал, что этот мой массив и используется как основной и единственный буфер.

Правильно ли я понимаю, что Вы предлагаете выполнять операцию BaseStream.Read(BinPoints, SizeOf(SizeBinPoints)) столько раз, сколько вообще записей в файле? Или я не правильно Вас понял?

Источник

Ошибка Out of memory

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Ошибка out of memory
Всем привет! При загрузке файла выше 200-300 мб вылазит ошибка out of memory Вот сам код как я.

Ошибка: Out of Memory
XE-5 AllocMemSize: Integer deprecated; AllocMemCount: Integer deprecated;.

Ошибка: Out of memory на Delphi XE3
Добрый день, при разработке программ время от времени появляется ошибка Out of memory, причем в.

Ошибка out of memory
Пишу программу. Программа работает с текстовыми файлами. Краткий алгоритм. Прочитать 1й файл.

Добавлено через 1 минуту

«Больше всего» мне ни о чем не говорит.

А Cnt нужно задавать перед обработкой и в конце обработки куска файла инкриминировать?

Добавлено через 5 минут

Добавлено через 5 минут

HexInput здесь не понадобится. Нужно только грузить в буфер, потом шифровать его и записывать на прежнее место в файле.
Там ещё перед записью зашифрованного блока надо будет файловый указатель перемещать назад.
Я попозже напишу, как это делается.

Добавлено через 14 часов 2 минуты
Код, необходимый для работы с файлом и для выполнения шифрования.

Добавлено через 14 часов 2 минуты
Код, необходимый для работы с файлом и для выполнения шифрования.

I/O error 998 выдает

Источник

Delphi out of memory как исправить

Так как Delphi пользуюсь нечасто, возникла проблема, решить которую сам пока не могу. Поиск тоже ничего что-то не дал..

Объявлен тип, например: type TValues = array [0..8] of Variant;
Объявлен массив: Values: array of TValues;


Defunct © ( 2005-06-01 04:35 ) [1]

Попробуйте заменить массив на TList, там SetLength используется немного не так как у вас.

Читайте также:  метабо что за фирма что за страна

при очередном запросе Вorland Мemory Мanager»а на перераспределение памяти система не обнаружила в АП тек.процесса свободного региона затребованного размера и вернула отказ, о чем ВММ любезно и сообщил соотв.исключением

скорей всего АП процесса на момент отказа было сильно фрагментировано по причине предыдущих массированных «мелких» реаллокаций, инициированных вызовами SetLength()


ANB © ( 2005-06-01 08:57 ) [3]


Anatoly Podgoretsky © ( 2005-06-01 09:06 ) [4]

TrueCoder (01.06.05 03:29)
Где код?

> но у процесса 4Г адресного пространства

Причем, учти, из них половина отдана под ядро, а в оставшейся половине кроме данных твоего приложения располагаются exe-шник твоего приложения, а также все библиотеки. Плюс много других данных, используемых приложением. В итоге остается достаточно свободной памяти, но если расходовать ее неправильно, то и она может кончиться.


ANB © ( 2005-06-01 09:16 ) [6]


Bel © ( 2005-06-01 09:21 ) [7]


evvcom © ( 2005-06-01 09:22 ) [8]

эта цифирь не имеет отношения к ВАП процесса

Если человеку не нужны механизмы TList, то достаточно увеличивать длину массива так, как это сделано в TList.Grow, тем более, что количество действительных элементов массива он и так подсчитывает в Count


ANB © ( 2005-06-01 09:32 ) [11]

Возник вопрос: а чем же TList лучше? В не тоже есть Realloc»и, хоть и реже вызываемые, но в итоге точно также потребуется большой объем памяти (правда Pointer меньше чем Variant, но это лишь вопрос количества элементов).


Думкин © ( 2005-06-01 09:48 ) [13]


> Думкин © (01.06.05 09:48) [13]

Вроде ошибка: Out of memory, а не Unable to Realloc? Не хватает, как я понял, объема, причем здесь количество реалокейтов?

Без кода и поллитры не разберемся.


Думкин © ( 2005-06-01 10:05 ) [16]


evvcom © ( 2005-06-01 10:17 ) [18]


> Mx © (01.06.05 10:13) [17]

Каков характер твоих данных? Необходим ли тебе доступ к произвольному элементу этого массива в любой момент времени? Или эти данные обрабатываются строго по порядку (сверху вниз или снизу вверх, не важно)?

У меня данных нет, почитал ветку и кое чего не понял, вот и спросил. вдогонку.


evvcom © ( 2005-06-01 10:24 ) [20]

Да, действительно. [18] должно быть адресовано TrueCoder

Продолжаю. Допустим у нас 20 ячеек памяти, каждая пятая занята. Тогда какая разница, что я «дойду» до необходимости выделения 6 смежных ячеек, а что я их сразу запрошу? Свободных то все-равно нет. Это я имел ввиду в вопросе.


> Mx © (01.06.05 09:55) [14]
> Вроде ошибка: Out of memory, а не Unable to Realloc? Не
> хватает, как я понял, объема, причем здесь количество реалокейтов?

если отказал VirtualAlloc, грабли в дефрагментации и/или отсутствии региона нужного размера

У меня примера нет. Может автор проверит?

а в целом грабли даже и искать не нужно

лезем в sysutils.pas, видим там

т.е. отказ вернула ф-ция LocalAlloc из-за исчерпания кучи

Как на это влияет число вызовов ReallocMem?

AddBlockAfter() вызывает LocalAlloc() посредством GetBlockDesc(), запрашивая из кучи блок памяти, а DeleteBlock() назад в кучу его не отдает

Все-равно не понимаю. Если я запрошу блок вначале 1*Integer, потом 2*Integer, потом 3*Integer. А если запрошу сразу 3*Integer, то что выиграю? И в том и в другом случае я запрашиваю 3*Integer ячеек. А! В первом случае получается 6*Integer, да? Правильно понял? Т.е., высвобождая предыдущий блок, ReallocMem не далает эти ячейки доступными для следующего Realloc»а?

Читайте также:  маклюра настойка на водке для чего применяется


> Mx © (01.06.05 11:32) [27]


> Если я запрошу блок вначале 1*Integer, потом 2*Integer,
> потом 3*Integer.

.. то потенциально возможны три вызова LocalAlloc() при ни одном LocalFree()


А если запрошу сразу 3*Integer, то что
> выиграю?

при этом будет не более чем один LocalAlloc()

ВММ оперирует понятием и механизмом «блок»

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

когда прикл.код обращается к ВММ за выделением памяти, ВММ ищет первый своб.блок минимально подходящего размера и помечает его как «занятый», манипулируя далее с соотв.регионами в АП процесса (1)

если своб.блок не найден, ВММ запрашивает из кучи фрагмент размера равного заголовку блока и затем выполняет (1)

когда прикл.код обращается к ВММ за освобождением памяти, ВММ ищет заголовок блока по полю размера, помечает этот блок как свободный, НЕ отдавая в кучу память, ранее запрошенную под этот блок, и далее опять же манипулирует соотв.регионами

Как все запушено. Спасибо, на досуге повнимательнее почитаю getmem.inc.


TrueCoder ( 2005-06-01 16:38 ) [30]

Большое спасибо всем ответившим. Даже не ожидал, что моя проблема поднимет такую дискуссию. Есть о чем подумать.
Трезвую мысль высказал Digitman: «Cкорей всего АП процесса на момент отказа было сильно фрагментировано по причине предыдущих массированных мелких реаллокаций, инициированных вызовами SetLength()». Интуитивно чувствую, что истина где-то тут.
Код привести, к сожалению, не могу, запутанный он. Там долго и нудно обрабатываются Variant-ячейки таблицы ExpressQuantumGrid (штука классная, но сложнаяяяя..). Исключение возникает при обработке порции порядка 5 тысяч записей, но записи большие, в каждой по 50 полей, большинство текстовые, разной длины, поэтому я даже затруднюсь сказать максимальный размер массива.

Насторожило то, что исключение возникает при объеме памяти, занимаемого приложением, в 128 Мб. По неопытности и подумал, может по умолчанию при компиляции какие ограничения существуют. А нет, чуда не произошло. 🙂


> TrueCoder (01.06.05 16:38) [30]


> Трезвую мысль высказал Digitman

т.е. отказ этот вызван исчерпанием хипа, а с хипом работает LocalAlloc, а LocalAlloc вызывается для аллокации памяти под заголовок блока, а не под сами данные, на которые занятый блок ссылается


> Буду думать, может TList прикрутить получится

рано или поздно и с ТЛист можно нарваться на ту же ситуацию


> Насторожило то, что исключение возникает при объеме памяти,
> занимаемого приложением, в 128 Мб

сразу после старта приложения запроси у системы хэндл дифолтного хипа своего процесса (GetProcessHeap) и тут же просканируй хип (HeapWalk)

а потом перед каждой своей итерацией, где ты реаллокируешь свой массив, делай тоже самое и следи за тем как изменяется состояние хипа


Anatoly Podgoretsky © ( 2005-06-01 20:40 ) [32]

И не запомнишь, у него адаптирующий алгоритм, с переменным количеством сколько. Вроде бы каждое увеличение на 25% от текущего размера блока, чем больше запрашиваешь, чем больше получаешь.


Defunct © ( 2005-06-02 01:21 ) [33]

Anatoly Podgoretsky © (01.06.05 20:40) [32]
> разница лишь в grow-алгоритме

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

Читайте также:  Что такое цилиндр в линзах для очков


TrueCoder ( 2005-06-03 23:39 ) [34]

Наверное, никому уже не интересно, но все же расскажу. Анализом кода удалось найти возможность заранее вычислять размер будущего массива, поэтому число реалокаций с 5 тысяч удалось снизить до двух. И проблема отпала сама собой.
Конечно, текущее решение значительно более красивое, как с точки зрения чистого кодинга, так и с точки зрения полученного удовлетворения от красивого решения проблемы :), но, все же, осталось некоторое удивление. Разве, стабильно работающая система (я о менеджере памяти Delphi и о самой операционке) не должны стабильно работать и при условии пусть некрасивых, но все же верных решений. Таких как 5 тысяч мелких реалокаций памяти у меня ранее. Что-то все же неладно в данном королевстве..
Интерес остался, конечно, исключительно чисто теоретический, проверять почему не работало раньше банально нет времени.


Defunct © ( 2005-06-04 02:53 ) [35]

Источник

Delphi out of memory как исправить

как быть, как позволить в Delphi своей программе занимать больше 500 мегабайт памяти?


KilkennyCat © ( 2009-02-19 23:15 ) [1]


Сергей М. © ( 2009-02-19 23:18 ) [2]


> моя программа отъедает 500 мегабайт


vps ( 2009-02-19 23:28 ) [3]


Сергей М. © ( 2009-02-19 23:30 ) [4]


> Несколько глобально объявленных массивов, процедура изменяет
> размер этих массивов и дописывает в них данные

Многократное увеличение размера динамических массивов? Если так, то происходит жуткая фрагментация памяти, и в результате не остается свободного непрерывного участка память для под новый массив. В общем сам виноват, поскольку нельзя так делать.

Данная проблема, и как делать правильно, не столь давно разбиралось в конференции.

> [4] Сергей М. © (19.02.09 23:30)
>> KilkennyCat
> Отдувайся, кот, сам)

Пересматривай логику программы.
Правда, тебе на это уже намекали, да ты совет offtopic-ом обозвал 🙂


Германн © ( 2009-02-20 00:12 ) [7]


> Несколько глобально объявленных массивов, процедура изменяет
> размер этих массивов и дописывает в них данные.(поиск файлов,
> ввод их данных в массивы)

И нафига всё это держать постоянно в памяти? А винчестер на что?


vps ( 2009-02-20 08:27 ) [8]


MBo © ( 2009-02-20 08:52 ) [9]

Будет! Это наихудший способ.


MBo © ( 2009-02-20 09:50 ) [11]


Плохиш © ( 2009-02-20 10:54 ) [12]


Sapersky ( 2009-02-20 15:25 ) [13]

Источник

Delphi out of memory как исправить

TNetworkRuleNumbering = class
Number: Integer;
Value: Integer;
end;

TInputPredicate = class
Name: String;
Value: Integer;
Weight:Real;
Left: Real;
LeftNumber:Integer;
Center: Real;
CenterNumber: Integer;
Right: Real;
RightNumber: Integer;
CurrentValue: Real;
procedure TriangleMF(x:Real);
end;

TOutputConclusion = class
Name: String;
Value: Integer;
CurrentValue: Real;
end;

TNetworkInput = class
Name: String;
InDataNumber: Integer;
IsFuzzy: Boolean;
Predicates: array of TInputPredicate;
NumPredicates: Integer;
WinnerPredicate: Integer;
WinnerValue: Real;
MinVal: Real;
MaxVal: Real;
end;

TNetworkOutput = class
Name: String;
InDataNumber: Integer;
Conclusions: array of TOutputConclusion;
NumConclusions: Integer;
IsNotSet: boolean;
WinnerConclusion: Integer;
TotalOutputValue: Real;
NumCasesWithOutput: Integer;
end;

TNetworkRule = class
Weight: Real;
NumPredicates: Integer;
Predicates: array of TNetworkRuleNumbering;
Conclusion: TNetworkRuleNumbering;
ShouldBeDeleted:Boolean;
end;

TNetwork = class
Inputs: array of TNetworkInput;
Outputs: array of TNetworkOutput;
Rules: array of TNetworkRule;
NumInputs: Integer;
NumOutputs: Integer;
NumRules: Integer;
NumWorkedCases: Integer;
NumErrors: Integer;
InputLabels : array of TLabel;
MFImages : array of TImage;
procedure InitiateFromChromosome(Chromosome: TChromosome);
procedure CalculateWeights(Dataset: TDataset);
procedure CalculateError(Dataset: TDataset);
procedure WriteFF(ChromosomeNumber: Integer);
procedure DeleteRules(MinimalWeight: Real);
procedure InitiateFromDataset(Dataset: TDataset);
procedure GenerateRules;
procedure ShowNetworkParams(ScrollBox:TScrollBox;Memo:TMemo);
procedure SaveToFile(FileName:String);
procedure ShowNetwork(Memo: TMemo);
end;

Источник

Образовательный портал