out of memory while expanding memory stream что делать
Out of memory while expanding memory stream что делать
При записи в поток TMemoryStream методом writeBufer возникает ошибка «Out of memory while expanding memory stream». Запись в поток осуществляется в цикле
For i:=1 to N do
begin
TMemoryStream.writebuffer(x,Sizeof(x));
end;
Число N равно 150-200 тыс.
Данных где-то около 40-50Мб.
Что можно сделать, чтобы ошибки не возникало. Заранее спасибо.

Smithson ( 2003-03-14 16:31 ) [1]
Что значит Out of memory?

Anatoly Podgoretsky ( 2003-03-14 16:38 ) [2]
А что значит Sizeof(x)

Сергей ( 2003-03-14 16:42 ) [3]
re: Что значит Out of memory?
Это типа не хватает памяти, а вообще в тексте приведен текст ошибки.

theodor_iv ( 2003-03-14 16:52 ) [4]
Тебе изначально зачем две копии одних и тех же данных в оперативной памяти, да еще по 50 мегабайт каждая?

Сергей ( 2003-03-14 16:55 ) [6]
theodor_iv © : Данные пишутся из массива в поток, а затем записываюся в файл.

Anatoly Podgoretsky ( 2003-03-14 16:56 ) [7]
Ну так все таки, чего молчишь про Sizeof(x)

theodor_iv ( 2003-03-14 16:57 ) [8]
Я так и думал. А почему нельзя их сразу записать в TFileStream?

Сергей ( 2003-03-14 16:59 ) [9]
Digitman ©: Сначала данные из текстового файла пишуться в динамический массив, а далее, чтобы каждый раз не загружать эти данные из текстового файла (потому что очень долго), я хочу их записывать в своем формате, в двоичном файле. Загрузка такого файла осуществляется гораздо быстрее. Вот.
Пока ты не скажешь про Sizeof(x) тебе никто не сможет ответить, но есть подозрение что это много.

Сергей ( 2003-03-14 17:02 ) [11]
Sizeof(x) Вычисляет размер буфера для одного элемента массива, ну правильнее будет Sizeof(x[i])

kDenis ( 2003-03-14 17:03 ) [12]
> Сергей
Ну напиши ты просто:
TMemoryStream.writebuffer(x,Sizeof(x));
Без всяких цыклов.
> Anatoly Podgoretsky ©
> theodor_iv ©
Хватит издиватся над человеком!

Digitman ( 2003-03-14 17:05 ) [13]

Anatoly Podgoretsky ( 2003-03-14 17:07 ) [14]
Сергей (14.03.03 17:02)
Да не что он вычитает, а сколько возвращает в твоем случае
Без всяких цыклов.
Не получиться, потому, что размер динамического массива функцией sizeOF не вычисляется.

Anatoly Podgoretsky ( 2003-03-14 17:10 ) [16]
Сергей (14.03.03 17:02)
Да и раз ты уже изменил показания, то давай новый правильный код со всеми данными
kDenis © (14.03.03 17:03)
Я очень сожалею по поводу твоего негодования, но ничем не могу помочь, только автор вопроса может ответить о размере X удобным ему способом. Мы же в отличии от тебя не телепаты

theodor_iv ( 2003-03-14 17:10 ) [17]

Anatoly Podgoretsky ( 2003-03-14 17:11 ) [18]
theodor_iv © (14.03.03 17:10)
Если твое предположение насчет 50 иб верное, то встает вопрос, а где взять 10 терабайт

theodor_iv ( 2003-03-14 17:14 ) [19]
> Anatoly Podgoretsky ©
Я так понял, что под фразой
> Данных где-то около 40-50Мб.
понимался суммарный объем, а не объем одного Х.

Сергей ( 2003-03-14 17:14 ) [20]
Anatoly Podgoretsky © (14.03.03 17:07):

Сергей ( 2003-03-14 17:15 ) [21]
theodor_iv © (14.03.03 17:14): Все правильно понимаете

Anatoly Podgoretsky ( 2003-03-14 17:18 ) [22]
Давай правильный код и размеры, иначе не ответить, но если у тебя 10иб, то посчитай сам 200 000 * 10 000 000, то это 10 терабайт, а виндоус поддерживает жля пользователя только 2 гигабайта виртуальной памяти в одном процессе.

theodor_iv ( 2003-03-14 17:23 ) [23]
> Сергей (14.03.03 17:15)
> theodor_iv © (14.03.03 17:14): Все правильно понимаете
Для того, чтобы создать такой поток, операционке нужно выделить более 50 мегабайт оперативной памяти одним непрерывным блоком, что является для нее нетривиальной задачей. 🙂

Сергей ( 2003-03-14 17:25 ) [24]
Anatoly Podgoretsky © (14.03.03 17:18): Какие 10иб, кто это сказал? привожу код.
//Сохранение полигона в файл
procedure SavePolygon(Stream : TMemoryStream;Pol: TPolygon);
var SizePol: integer;
begin
SizePol:= Length(POl);
Stream.WriteBuffer(SizePol,SizeOf(Integer));//Пишем длину
Stream.WriteBuffer(PChar(POl)^,SizePol*SizeOf(TPoints));
end;
end;
//Сохранение свойств полигона
procedure TProjection.SavePolygonProp1(Stream : TMemoryStream;Prop: TPropPolygon);
var SizePol: LongInt;
begin
SizePol:= SizeOf(Prop);
Stream.WriteBuffer(Prop,SizePol);
end;
//Сохранение слоя в файл
procedure TProjection.SaveLayer1(Stream:TMemoryStream;L: TLayer);
var amPolygon: dword; //Число полигонов в слое
i: integer;
begin
amPolygon:=length(L.DataP);
Stream.WriteBuffer(amPolygon,SizeOf(amPolyGon));
for i:=1 to amPolygon do
begin
SavePolygon1(stream,L.DataP[i-1]);
SavePolygonProp1(stream,l.PolProp[i-1]);
end;
Stream.WriteBuffer(L.names,SizeOf(L.names));
Stream.WriteBuffer(L.vis,SizeOf(L.Vis));
end;
strm.SaveToFile(SaveDialog1.FileName);

Anatoly Podgoretsky ( 2003-03-14 17:37 ) [25]
Абсолютно другой код, чем в 16:25
Но точно также неясно насчет размеров записываемых элементов
Говорите точно сколько вам вешать, в байтах, память все таки.
Если не знаешь точно, то поступи так,
заведи переменную X
перед каждым Stream.WriteBuffer делай
X := X + размер;
Label1.Caption := IntToStr(X);
//Label2.Caption := IntToStr(I);
Application.ProcessMessages;
И узнаешь правду, до этого убедись, что на диске со своп файлом есть по крайней мере свободных 2 гб

Digitman ( 2003-03-14 17:45 ) [26]

theodor_iv ( 2003-03-14 17:49 ) [27]
> Digitman © (14.03.03 17:45)
нахрена (!!) писать данные в память
Видимо, какую-то тайную цель преследует. Я тут уже об этом четыре раза сказал, но ответа не получил.

Anatoly Podgoretsky ( 2003-03-14 17:55 ) [28]
А я не получил ответа о размере данных, в тоже время жалоба на нехватку оной. Но может если проведет отладку по указанному сценарию то все таки сообщит.

Serginio ( 2003-03-14 20:35 ) [29]
У меня при размере > 80 000*4 байт поэтому для записи больших данных создал свой стрим основанный на массиве больших блоков памяти. А вообще то проблема с реалоками во всех объектах которые используют непрерывную память (TList,TStringList..) если хочешь вышлю.
Многие пользователи ПК во время работы с какой-либо программой могут столкнуться с «вылетом» указанной программы, и появившимся сообщением «Out of memory». Возникшая проблема может иметь множество причин, начиная от банального недостатка памяти на пользовательском ПК, и заканчивая некорректной работой с памятью какой-либо программы.
Причины появления дисфункции
Сообщение «Out of memory» (в переводе дословно «вне памяти», или «недостаточно памяти») обычно возникает при недостатке памяти на пользовательском компьютере. В частности же, в появлении данной ошибки «виновен» следующий набор факторов:
Когда вашему компьютеру не хватает физической R.A.M. памяти, он заимствует часть места на жёстком диске, и создаёт так называемую «виртуальную память». Система временно хранит в такой виртуальной памяти ту часть данных, которая не помещается в памяти обычной. Такие данные обычно хранятся в файле «pagefile.sys», размер которого может увеличиваться или уменьшаться в зависимости от специфики работы вашей ОС. Если на диске будет недостаточно места, файл «pagefile.sys» не сможет расти, и пользователь получит рассматриваемую ошибку.
Как исправить ошибку «Out of memory»
Для решения указанной проблемы рекомендую сделать следующее:
Альтернативным вариантом решения проблемы является установка соответствующего фикса от Майкрософт. Или использование расширений или дополнений для браузера уровня «The Great Suspender» для «Google Chrome», хорошо работающего с ненужными вкладками браузера.
bcdedit/set IncreaseUserVa 3072
И нажмите на ввод, и перезагрузите ваш ПК. Функционал данной команды позволяет выделить пользовательским приложениям 3 гигабайта оперативной памяти для работы. В некоторых системах этого может быть слишком много, потому если после ввода данной команды система начала чаще сбоить, то введите в командной строке от имени администратора:
bcdedit /set IncreaseUserVa 2560 — что позволит задействовать 2,5 гигабайта вместо ранее забронированных 3.
Если ситуацию этим исправить не удалось, верните настройки на состояние по умолчанию:
bcdedit /deletevalue IncreaseUserVa
Установите нужный размер файла подкачки
Заключение
Ошибка «Out of memory» может иметь множество причин, связанных как с физическим недостатком памяти на ПК, так и другими детерминантами, изложенными мной выше. Для решения проблемы советую закрыть ненужные программы (вкладки браузера) на вашем компьютере (тем самым разгрузив его память), а самым эффективным инструментом является установка дополнительной планки памяти на ПК, что в большинстве случаев поможет избавиться от ошибки на вашем компьютере.
Out of memory while expanding memory stream что делать
изза-чего может возникнуть такая ошибка, памяти хватает

Palladin © ( 2011-02-11 18:27 ) [1]
если тебе говорят что не хватает, то ее не может хватать, хотя с другой стороны если тебе памяти не хватает, то программе может хватать, ведь скорее всего памяти хватало до этого, а теперь не хватает, и программе не хватает памяти, что бы вспомнить что раньше ей памяти хватало, вот по этому памяти и не хватает

Anatoly Podgoretsky © ( 2011-02-11 19:11 ) [2]
> Palladin (11.02.2011 18:27:01) [1]
Не хватает, вот он и забыл про это.

Token ( 2011-02-11 20:08 ) [3]
А почему она возникает при выделении порядка 1Gb?
Не знаю, как экспандится поток, но может быть он сперва выделяет новую память, потом копирует в нее старые данные а затем удаляет старую память? Т.е. когда резервируется новая память, старая может еще не освобождаться. Такой подход, например, может приводить к нехватке памяти при SetLength очень больших массивов, когда памяти еще, казалось бы, хватает.
Именно сразу после создания, устанавливается размер порядка 1Gb. И не хотит. Хотя теоретически принципиальных ограничений я не вижу.

Token ( 2011-02-11 21:18 ) [6]

Palladin © ( 2011-02-11 21:19 ) [7]
все разговоры разговариваете, этим долго можно заниматься.
может на конкретику перейдете, станцуете или код покажете, на худой конец.
я вот взял переменную завел глобальненькую
var
a: array of Integer;
кнопочку кинул на формочку написав в onclick
SetLength(a, 1073741824 div 4);
и как то всем всего хватило
так что можете разговоры о теории разговаривать и дальше, но лично я вашему вранью о чистейшей правде и клятвах на святых бананах не поверю

Token ( 2011-02-11 21:23 ) [8]
str:=TMemoryStream.Create;
str.SetSize(1500000000);
—-
а вот str.SetSize(1600000000); уже не катит

Игорь Шевченко © ( 2011-02-11 21:27 ) [9]

Игорь Шевченко © ( 2011-02-11 21:31 ) [11]
проще узнать, сколько доступно и исходить из этого, а не желать странного и плакаться по форумам.

Token ( 2011-02-11 21:35 ) [12]
Я не плачусь, я спросил.

Игорь Шевченко © ( 2011-02-11 21:39 ) [13]
я автора имел в виду, если что

Token ( 2011-02-11 21:54 ) [14]
Ну на самом деле, я воспользовался случаем для прояснения ) До этого думал что под систему есть 3-ий гиг, и все 2 остальные мои. И как-то не доходило, что все «изолировано» и библиотеки надо отображать в адреса приложения.
> И. Павел (11.02.2011 21:02:04) [4]
А ты знаешь другой варинт, когда сначала удаляется старая память 🙂

Anatoly Podgoretsky © ( 2011-02-12 10:13 ) [16]
> Palladin (11.02.2011 21:19:07) [7]

Anatoly Podgoretsky © ( 2011-02-12 10:14 ) [17]
> Token (11.02.2011 21:23:08) [8]

Anatoly Podgoretsky © ( 2011-02-12 10:15 ) [18]
> Token (11.02.2011 21:35:12) [12]
Ты не спросил, ты пургу несешь

Anatoly Podgoretsky © ( 2011-02-12 10:16 ) [19]
> я автора имел в виду, если что
А я обеих и в первую очередь второго.
> Anatoly Podgoretsky © (12.02.11 10:16) [19]
> > я автора имел в виду, если что
> А я обеих и в первую очередь второго.
И целовался на кухне с обоими.
🙂

DiamondShark © ( 2011-02-14 12:49 ) [21]
Напишите себе стрим на базе файла с атрибутами FILE_ATTRIBUTE_TEMPORARY
or FILE_FLAG_DELETE_ON_CLOSE
А про MemoryStream забудьте как о страшном сне.
Как исправить ошибку «Out of Memory»
Ошибка «Out of Memory» обычно появляется, когда на компьютере запущено много программ, использующих ресурсы, доступные для компьютера. Компьютерная память или ОЗУ (оперативное запоминающее устройство) используется компьютером для быстрого хранения данных для их обработки.
Когда появляется эта ошибка?
Как я уже отмечал выше, запуск сразу нескольких программ может перегрузить объем доступной свободной памяти, что приведет к ошибке «Out of Memory». Это может случиться как с новыми программами, так и с уже запущенными на компьютере программами. Иногда это может произойти, независимо от объема доступной свободной памяти.
Причина ошибки «Out of Memory»
Причина этих ошибок немного сложнее. Подсистема WIN32 Windows имеет ограниченный объем доступной памяти. Если память в куче рабочих столов подсистемы WIN32 используется. Windows может выдавать сообщение об ошибке «Out of Memory».
Компьютеры, работающие не так, как операционные системы Microsoft Windows, не слишком уязвимы. Эта проблема в основном существует для пользователей Windows NT 3.5 и Windows NT 3.1
Как исправить ошибку «Out of Memory»
Чтобы исправить эту проблему, вам необходимо отредактировать свой реестр Windows. Редактирование реестра является рискованным занятием. Действовать нужно с осторожностью, и только строго по инструкции:
Чтобы избежать проблем, тщательно следуйте этим инструкциям.
Отсюда, следуйте этим шагам в зависимости от вашей операционной системы
Для Windows NT:
Для Windows 2000, Windows XP и Windows Server 2003:
Для 32-разрядных операционных систем
Для 64-разрядных операционных систем
Есть свой вариант быстрого решения ошибки «Out of Memory»? Пишите его в форму комментариев к этой статье, и если ваш вариант окажется полезным, мы обязательно дополним руководство.



