I am attempting to download a file from a web server using the standard TIdHTTP and TIdSSLIOHandler components in Delphi 10.4:
memorystream := TMemoryStream.Create;
http.request.useragent:='Mozilla/5.0 (Windows NT 5.1; rv:2.0b8) Gecko/20100101 Firefox/4.0b8';
http.HandleRedirects := True;
try
http.get('https://dl.nmkd.de/ai/clip/coco/coco.ckpt',memorystream);
except
on E:Exception do memo.lines.add(E.Message);
memo.lines.add(http.responsetext);
end;
application.ProcessMessages;
memorystream.SaveToFile('coco.ckpt');
memorystream.free;
The responses I get in the memo are:
Out of memory while expanding memory stream
HTTP/1.1 200 OK
The file is around 9 GB in size.
How do I get a MemoryStream to be able to handle that size? I have more than enough physical RAM installed in the PC.
Remy Lebeau
534k30 gold badges442 silver badges748 bronze badges
asked Jun 13, 2021 at 17:57
3
Instead of loading the resource to memory temporarily, directly load it to the local file using a TFileStream:
Stream := TFileStream.Create('coco.cpkt');
try
try
http.get('https://dl.nmkd.de/ai/clip/coco/coco.ckpt', Stream);
except
on E:Exception do memo.lines.add(E.Message);
end;
finally
Stream.Free;
end;
answered Jun 13, 2021 at 19:01
![]()
mjnmjn
36.2k28 gold badges172 silver badges375 bronze badges
← →
Сергей
(2003-03-14 16:25)
[0]
При записи в поток 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 мегабайт каждая?
![]()
![]()
← →
Digitman
(2003-03-14 16:54)
[5]
зачем реально может понадобиться в памяти поток такого большого размера — ума не приложу
![]()
![]()
← →
Сергей
(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 ©: Сначала данные из текстового файла пишуться в динамический массив, а далее, чтобы каждый раз не загружать эти данные из текстового файла (потому что очень долго), я хочу их записывать в своем формате, в двоичном файле. Загрузка такого файла осуществляется гораздо быстрее. Вот.
![]()
![]()
← →
Anatoly Podgoretsky
(2003-03-14 17:01)
[10]
Пока ты не скажешь про 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]
> Сергей
ну и что ?
что мешает выполнить в цикле «прямую» цепочку :
InFileStream (текст) -> нужное преобразование фрагмента -> OutFileStream(бинарный формат)
?
![]()
![]()
← →
Anatoly Podgoretsky
(2003-03-14 17:07)
[14]
Сергей (14.03.03 17:02)
Да не что он вычитает, а сколько возвращает в твоем случае
![]()
![]()
← →
Сергей
(2003-03-14 17:10)
[15]
Без всяких цыклов…
Не получиться, потому, что размер динамического массива функцией 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]
> kDenis ©
Кто здесь издЕвается — так это ты… А мы помочь пытаемся, хотя и разными методами 🙂
> Сергей
Моя мысль вполне здравая — зачем записывать динамический массив из оперативной памяти в оперативную память, а потом в файл, если можно записать сразу в файл и сэкономить 50 мег оперативки?
![]()
![]()
← →
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):
Дело в том, что я написал немного упрощенно. x[i] — динамический массив записей. Каждая запись в свою очередь содержит динамические структуры.
Ну короче у меня получается загрузка и запись данных для объемов
5-10 мБ. Когда я использую входные текстовые данные больших размеров возникает эта ошибка.
![]()
![]()
← →
Сергей
(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 мегабайт оперативной памяти одним непрерывным блоком, что является для нее нетривиальной задачей. 🙂
На мой взгляд, единственный выход — писать сразу в TFileStream, можно еще в сочетании с TCompressionStream.
![]()
![]()
← →
Сергей
(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]
вот ты ответь на простой вопрос — нахрена (!!) писать данные в память, когда в результате они тут же пишутся строчкой strm.SaveToFile(SaveDialog1.FileName); в файл ?? безо всякой промежуточной обработки ?? почему сразу не писать в FileStream ??
![]()
![]()
← →
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..) если хочешь вышлю.
![]()
![]()
- Guest
2003-01-24 22:40
I’m having a problem uploading a 20 Meg plain text file. I’m using version 2.1.0 build 119 and get the error message.
Out of memory while expanding memory stream
I may have downloaded the file as binary from another server, I’m not sure and am going to check that now.
Reply with quote
Advertisement
- Guest
2003-01-24 22:41
If I transfer the file as binary I do not appear to get the error message.
I’m having a problem uploading a 20 Meg plain text file. I’m using version 2.1.0 build 119 and get the error message.
Out of memory while expanding memory stream
I may have downloaded the file as binary from another server, I’m not sure and am going to check that now.
Reply with quote
-
martin◆
Site Admin -
- Joined:
- 2002-12-10
- Posts:
- 38,408
- Location:
- Prague, Czechia
2003-01-25
Anonymous wrote:
I’m having a problem uploading a 20 Meg plain text file. I’m using version 2.1.0 build 119 and get the error message.
Out of memory while expanding memory stream
This is quite possible as WinSCP loads files transfered in ASCII mode first to memory, where it converts them. And only after that they are saved to file (when downloading) or trasfered (when uploading).
Reply with quote
Advertisement
#1
![]()
xfruit
-

- Members
-

- 18 сообщений
Новый участник
- ФИО:Александр
Отправлено 17 июля 2007 — 15:48
Возникла следущая пролема:
Запускаю TC из под Virtual PC 2007.
При запуске одного теста, приложение либо зависает (приходится вырубать процесс), либо падает с сообщениями об ошибках памяти. Например «Error reading ImageList.Bitmap: out of memory while expanding memory stream».
Может кто сталкивался с подобным? как можно решить?
-
0
- Наверх
#2
![]()
Dmitry N
Dmitry N
- ФИО:Николаев Дмитрий
- Город:Где-то в России
Отправлено 18 июля 2007 — 04:11
Здравствуйте.
А увеличение объёма памяти, выделенной для виртуальной машины, не помогает? Сколько всего памяти выделено для машины? Как скоро после начала теста происходит ошибка? Сколько памяти потребляет TestComplete и тестируемое приложение при возникновении ошибки?
-
0
С уважением,
Дмитрий
- Наверх
#3
![]()
xfruit
xfruit
-

- Members
-

- 18 сообщений
Новый участник
- ФИО:Александр
Отправлено 19 июля 2007 — 09:19
Здравствуйте.
А увеличение объёма памяти, выделенной для виртуальной машины, не помогает? Сколько всего памяти выделено для машины? Как скоро после начала теста происходит ошибка? Сколько памяти потребляет TestComplete и тестируемое приложение при возникновении ошибки?
Там какаято проблема с Shared Folder. Дело в том что скрипт в самом начале должен скопировать из Shared Folder папку с файлами на локальный диск. Сама папка лежит гдето на 6-ом уровне вложенности на диске Z: который является собственно мапом на Shared Folder. Скрипт зависает при копировании папки с этого диска. Если я этого не делаю все работает нормально.
Shared Folder — в смысле доступ к папке на локальном компьютере — не через сеть.
Virtual PC: RAM — 512,
Test Complete потребляет 130 метров. — вобще с памятью как бы все нормально, покрайней мере судя по тому что я наблюдал в Task Manager. На рабочей станции у меня 2 Гигабайта RAM. Непонятно почему TestComplete выдает ошибку памяти. На мой взгляд проблема именно в копировании данных из Shared Folder. Подозреваю также что проблема может быть в Virtual PC. Потомучто время от времени доступ к диску Z становится не стабильным. Но покрайней мере ТестКомплит об этом не упоминает в сообщении об ошибке.
-
0
- Наверх
#4
![]()
xfruit
xfruit
-

- Members
-

- 18 сообщений
Новый участник
- ФИО:Александр
Отправлено 19 июля 2007 — 10:07
Здравствуйте.
А увеличение объёма памяти, выделенной для виртуальной машины, не помогает? Сколько всего памяти выделено для машины? Как скоро после начала теста происходит ошибка? Сколько памяти потребляет TestComplete и тестируемое приложение при возникновении ошибки?
Там какаято проблема с Shared Folder. Дело в том что скрипт в самом начале должен скопировать из Shared Folder папку с файлами на локальный диск. Сама папка лежит гдето на 6-ом уровне вложенности на диске Z: который является собственно мапом на Shared Folder. Скрипт зависает при копировании папки с этого диска. Если я этого не делаю все работает нормально.
Shared Folder — в смысле доступ к папке на локальном компьютере — не через сеть.
Virtual PC: RAM — 512,
Test Complete потребляет 130 метров. — вобще с памятью как бы все нормально, покрайней мере судя по тому что я наблюдал в Task Manager. На рабочей станции у меня 2 Гигабайта RAM. Непонятно почему TestComplete выдает ошибку памяти. На мой взгляд проблема именно в копировании данных из Shared Folder. Подозреваю также что проблема может быть в Virtual PC. Потомучто время от времени доступ к диску Z становится не стабильным. Но покрайней мере ТестКомплит об этом не упоминает в сообщении об ошибке.
Извиняюсь за ошибку. Не Test Complete потребляет 130 метров, а всего памяти занято.
И про нестабильность работы Virtual PC я тоже преувиличел. Обычным скриптом удается скопировать нормально.
-
0
- Наверх
#5
![]()
Dmitry N
Dmitry N
- ФИО:Николаев Дмитрий
- Город:Где-то в России
Отправлено 19 июля 2007 — 10:39
Здравствуйте.
А как вы копируете файлы? Может, попробуете какой-нибудь другой способ? Например, через FileSystemObject.
-
0
С уважением,
Дмитрий
- Наверх
#6
![]()
xfruit
xfruit
-

- Members
-

- 18 сообщений
Новый участник
- ФИО:Александр
Отправлено 19 июля 2007 — 11:38
Здравствуйте.
А как вы копируете файлы? Может, попробуете какой-нибудь другой способ? Например, через FileSystemObject.
Пробывал и через BuiltIn и через FileSystemObject.
Можно попробывать конечно через shell bat вызывать свой.
Сейчас я проблему решил так — копирую все входные файлы данных из Shared Folder в специальную папку на C: (при загрузке системы) и потом скрипты уже оттуда берут все что им нужно. С C: на C: копирование проходит нормально.
-
0
- Наверх
#7
![]()
Dmitry N
Dmitry N
- ФИО:Николаев Дмитрий
- Город:Где-то в России
Отправлено 20 июля 2007 — 06:54
Здравствуйте.
Вообще, конечно, странно. Никогда такого не видел. А хоть сколько-нибудь файлов успевает скопироваться, или ТС сразу виснет? Если несколько файлов успевают скопироваться, может ТС какой-то конкретный файл не нравится?
-
0
С уважением,
Дмитрий
- Наверх
#8
![]()
xfruit
xfruit
-

- Members
-

- 18 сообщений
Новый участник
- ФИО:Александр
Отправлено 20 июля 2007 — 07:02
Здравствуйте.
Вообще, конечно, странно. Никогда такого не видел. А хоть сколько-нибудь файлов успевает скопироваться, или ТС сразу виснет? Если несколько файлов успевают скопироваться, может ТС какой-то конкретный файл не нравится?
Количество скопированных и не скопированных файлов каждый раз разное, иногда скопированно почти все иногда только меньшая часть. Не думаю что дело в конкретном файле, т.к. ведь зависает он с регулярностью но не постоянно.
-
0
- Наверх
|
|
|
|

Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.
Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.
Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка — 60 дней. Последующие попытки бан.
Мат в разделе — бан на три месяца…
Полезные ссылки:
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы
Выразить свое отношение к модераторам раздела можно здесь:
Krid,
Rouse_

Проблема с отправкой MemoryStream от сервера к клиенту
, все это с помощью INDY из Делфи 7
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
|
|
Друзья, в чем дело? Что не так? вот строчка сервера, который получая строку от клиента, отправляет ему Strings:
if(AThread.Connection.ReadLn()=’clientexec’)then begin OnlnS := TMemoryStream.Create; OnlnS.Position:=0; ValueListEditor1.Strings.SaveToStream(OnlnS); Athread.Connection.WriteStream(OnlnS,true,false); //Athread.Connection.WriteInteger(5); Onlns.Free; end;
а вот клиент:
Client.Connect(); OnlineS := TMemoryStream.Create; Client.WriteLn(‘clientexec’); OnlineS.Position:=0; Client.ReadStream(OnlineS,-1,true); //в этой строчке таймаут!!!! ValueListEditor1.Strings.LoadFromStream(OnlineS); Client.Disconnect(); почему, возникает ошибка таймаута??? Помогите пожалуйста! это было час назад. теперь я очень намудрил, и просто шлю мемористрим от клиента к серверу:
procedure TForm1.FormCreate(Sender: TObject); var i:Int64; //думал проблема в представлении чисел, но даже инт64 не помогает p:TStringList; begin client.Connect(); OnlineS := TMemoryStream.Create; p:=TStringList.Create; p.Add(‘vovik’); client.WriteInteger(5); //ValueListEditor1.Strings.SaveToStream(OnlineS); p.SaveToStream(OnlineS); //OnlineS.Position:=0; i:=OnlineS.Size; client.WriteStream(OnlineS,true,false,i); client.Disconnect(); Onlines.Free; end; сервер:
procedure TForm1.ServerExecute(AThread: TIdPeerThread); var FN: String; F: TFileStream;p:TStringList;h:TStrings; begin i:=AThread.Connection.ReadInteger(true); h:=TStrings.Create; ShowMessage(intToStr(i)); OnlnS := TMemoryStream.Create; p:=TStringList.Create; //AThread.Connection.ReadStream(OnlnS,-1,false); //если эта строка, то ошибка памяти AThread.Connection.ReadStrings(h); //если эта(вообще не передаю поток), то ошибка абстрактного класса ShowMessage(‘proverka svza’); OnlnS.Position:=0; p.LoadFromStream(OnlnS); p.Free; OnlnS.Free; помогите очень прошу! |
|
WildBear |
|
|
Senior Member
Рейтинг (т): 47 |
client.WriteStream(OnlineS,true,true,OnlineS.Size); // посылай так AThread.Connection.ReadStream(OnlnS,-1,false); // принимай так
А h:TStrings переделай в h:TStringList; |
|
ragnarek |
|
|
Абстрактный клас,это клас, методы которого надо перекрыть?Ладно, тут я допустил ошибку. Но с передачей размера,ничего не меняется!
client.WriteStream(OnlineS,true,true,OnlineS.Size); // посылай так у меня во втором примере клиента вот как:
var i:Int64; //думал проблема в представлении чисел, но даже инт64 не помогает ….. i:=OnlineS.Size; client.WriteStream(OnlineS,true,false,i); тогда в строчке сервера
AThread.Connection.ReadStream(OnlnS,-1,false); возникает ошибка: Out of memory while expanding memory stream |
|
ragnarek |
|
|
Киньте кто-нибудь рабочий исходник передачи MemoryStream()!!! |
|
WildBear |
|
|
Senior Member
Рейтинг (т): 47 |
Глянь еще раз мою строчку на передачу… |
|
ragnarek |
|
|
офигеть, спасибо! Я чуть с ума не сошел пока передвал)) Объясни пожалуйста, почему в случае FileStream
client.WriteStream(OnlineS,true,FALSE); a MemoryStream
client.WriteStream(OnlineS,true,TRUE,OnlineS.Size); Сообщение отредактировано: ragnarek — 29.01.09, 12:05 |
|
WildBear |
|
|
Senior Member
Рейтинг (т): 47 |
Нет, в обоих случаях подходит один и тот же вариант. Просто второе TRUE означает, что перед посылкой потока должен быть передан его размер (OnlineS.Size) |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Сетевое программирование
- Следующая тема
[ Script execution time: 0,0585 ] [ 16 queries used ] [ Generated: 30.01.23, 02:40 GMT ]
Многие пользователи ПК во время работы с какой-либо программой могут столкнуться с «вылетом» указанной программы, и появившимся сообщением «Out of memory». Возникшая проблема может иметь множество причин, начиная от банального недостатка памяти на пользовательском ПК, и заканчивая некорректной работой с памятью какой-либо программы.
- Причины появления дисфункции
- Как исправить ошибку «Out of memory»
- Заключение

Причины появления дисфункции
Сообщение «Out of memory» (в переводе дословно «вне памяти», или «недостаточно памяти») обычно возникает при недостатке памяти на пользовательском компьютере. В частности же, в появлении данной ошибки «виновен» следующий набор факторов:
- Недостаток памяти RAM на вашем ПК (рабочей памяти, планки которой установлены на материнской плате вашего компьютера). Если на вашем компьютере установлен всего 1 гигабайт памяти, вы будете встречаться с описываемой ошибкой довольно часто. Нормальным же ныне считается наличие на компьютере 4 гигабайт памяти и выше;
- Недостаток места на жёстком диске.
Когда вашему компьютеру не хватает физической R.A.M. памяти, он заимствует часть места на жёстком диске, и создаёт так называемую «виртуальную память». Система временно хранит в такой виртуальной памяти ту часть данных, которая не помещается в памяти обычной. Такие данные обычно хранятся в файле «pagefile.sys», размер которого может увеличиваться или уменьшаться в зависимости от специфики работы вашей ОС. Если на диске будет недостаточно места, файл «pagefile.sys» не сможет расти, и пользователь получит рассматриваемую ошибку.
- При одновременном запуске на ПК большого количества программ, каждая из которых бронирует часть памяти ПК под свои задачи;
- При запуск большого количества вкладок браузера. Веб-навигаторы уровня «Firefox» или «Google Chrome» способны занимать от 500 мегабайт до 1 гигабайта памяти под свой функционал, при этом число открытых вкладок и соответствующей обслуживающей памяти может быть ограничено системой. Специалисты Майрософт называют такую проблему «the desktop heap limitation» — «ограничение кучи рабочего стола»);
- Некорректная работа с памятью ряда программ (наиболее часто это игровые программы);
- Не оптимальный размер файла подкачки, с которым работает система.

Как исправить ошибку «Out of memory»
Для решения указанной проблемы рекомендую сделать следующее:
- Перезагрузите ваш ПК, и запустите требуемую программу вновь. Возможно, что проблема имеет случайный характер, и более повторяться не будет;
- Перед запуском нужной программы закройте другие ненужные программы (браузер, музыкальный или видео плеер, текстовый или графический редактор, мессенджер и так далее);
- Если проблема возникает во время серфинга в сети, закройте всё множество вкладок вашего браузера (при наличии), оставив лишь одну или две.

Альтернативным вариантом решения проблемы является установка соответствующего фикса от Майкрософт. Или использование расширений или дополнений для браузера уровня «The Great Suspender» для «Google Chrome», хорошо работающего с ненужными вкладками браузера.
- Добавьте оперативной памяти на ваш ПК. Если у вас на компьютере установлено 1-2 гигабайта памяти, будет оптимальным довести её объём до 4 гигабайт (а для 64-битных Виндовс 7, 8 и 10 версии рекомендую 8 и более гигабайт);

- Убедитесь, что на вашем жёстком диске (или SSD) достаточно свободного места. При необходимости, освободите диск от ненужных файлов;
- Используйте инструмент командной строки BCDEdit для изменения параметров загрузки системы. Если у вас на ПК установлена Виндовс 7 и более, запустите командную строку от имени администратора на Виндовс 7 и Виндовс 10, и в ней наберите:
bcdedit/set IncreaseUserVa 3072
И нажмите на ввод, и перезагрузите ваш ПК. Функционал данной команды позволяет выделить пользовательским приложениям 3 гигабайта оперативной памяти для работы. В некоторых системах этого может быть слишком много, потому если после ввода данной команды система начала чаще сбоить, то введите в командной строке от имени администратора:
bcdedit /set IncreaseUserVa 2560 — что позволит задействовать 2,5 гигабайта вместо ранее забронированных 3.
Если ситуацию этим исправить не удалось, верните настройки на состояние по умолчанию:
bcdedit /deletevalue IncreaseUserVa
- Увеличьте объём файла подкачки. Нажмите кнопку «Пуск», в строке поиска введите sysdm.cpl и нажмите ввод. В открывшемся окне настроек системы выберите «Дополнительно» — «Быстродействие» — «Параметры» — «Дополнительно» — «Виртуальная память» — «Изменить». Снимите галочку с опции автоматического размера, поставьте галочку на «Указать размер», и поставьте исходный размер в 8192, и максимальный в 8192. Затем выберите «Задать»;

Установите нужный размер файла подкачки
- Если ошибка возникает при использовании игровой программы, перейдите в её графические настройки, и выберите их минимальные значения;
- Произведите правильную настройку «Java». Для решения проблем с игровой программой «Майнкрафт» перейдите в Панель управления Виндовс, найдите там «Java» и запустите данную среду исполнения. Нажмите на кнопку «View», затем дважды кликните на «Runtime Parametres». Введите туда –Xms256m – Xmx3072m (или больше). Xms – это минимальное выделение ОЗУ, Xmx – максимальное. Значение Xmx рекомендуют устанавливать на процентов 70-80% от общего объёма ОЗУ. Примените изменения, и перезагрузите ваш ПК.
Заключение
Ошибка «Out of memory» может иметь множество причин, связанных как с физическим недостатком памяти на ПК, так и другими детерминантами, изложенными мной выше. Для решения проблемы советую закрыть ненужные программы (вкладки браузера) на вашем компьютере (тем самым разгрузив его память), а самым эффективным инструментом является установка дополнительной планки памяти на ПК, что в большинстве случаев поможет избавиться от ошибки на вашем компьютере.


