Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.20;
Скачать: CL | DM;

Вниз

Сколько TMemoryStream максимально можно создать в приложении?   Найти похожие ветки 

 
GreySerg   (2005-03-03 20:56) [0]

Сколько TMemoryStream максимально можно создать в приложении?
Если судить по этому коду :

procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
 Buffer:  string;
begin
   for i:= 0 to 100000  do
   begin
     with TMemoryStream.Create do
     try
        Write(Buffer, 1);
     except
        ShowMessage(IntToStr(i));
     end;
   end;

end;

то 65530 , когда i = 65530 , то Exception -  Out of Memory
Что за ограничение такое , кто-нибудь знает ?

P.S. : мне надо это , т.к. в моей проге используется  ObjectList , который в качестве объекта хранит TMemoryStream


 
Anatoly Podgoretsky ©   (2005-03-03 20:59) [1]

Пока хватит памяти


 
Юрий Зотов ©   (2005-03-03 21:23) [2]

procedure TForm1.FormClick(Sender: TObject);
var
 i: integer;
begin
 Caption := "";
 i := 0;
 with TObjectList.Create do
 try
   while i < 10000000 do // Без проблем, больше не пробовал
   begin
     Add(TMemoryStream.Create);
     Inc(i)
   end
 finally
   Free;
   Caption := IntToStr(i)
 end
end;


 
GreySerg   (2005-03-03 21:36) [3]

> Юрий Зотов
да, так работает ,а попробуйте что-нибудь в MemoryStreаm записать


 
GreySerg   (2005-03-03 21:40) [4]

>Anatoly Podgoretsky ©
я выделяю виртуалки несколько гигов , тот же эффект
мой код по любому выдает Out of memory while expanding memory stream на  65530 итерации , независимо от того пишу я в Stream 1 байт или больше


 
Anatoly Podgoretsky ©   (2005-03-03 21:43) [5]

GreySerg   (03.03.05 21:36) [3]
А это уже другая ситуация, тут уже поток + память для буферов, системных записей и прочего.


 
Sun bittern ©   (2005-03-03 22:01) [6]

GreySerg   (03.03.05 21:40) [4]

>> я выделяю виртуалки несколько гигов ,

А-а-а-а-а!!!

Минимальные системные требования к ПО: 10 Гб HDD...


 
Anatoly Podgoretsky ©   (2005-03-03 22:15) [7]

Голосуй, не голосуй, все равно получиль 2 гб


 
Дмитрий Мыльников   (2005-03-03 22:45) [8]

Объём доступной памяти тут не причём. Прога падает при попытке записи в поток на 65530 потому, что TMemoryStream работает с памятью через WinAPI и для каждого потока выделяется Handle. Как только свободное количество номеров для данного типа объектов заканчиватеся - появляется сообщение о нехватке ресурсов.
Меняйте идеологию приложения, либо пишите собственный аналог TMemoryStream, который будет работать с пямятью в обход WinAPI и не будет использовать Handle.


 
Anatoly Podgoretsky ©   (2005-03-03 22:53) [9]

Смотри Юрий Зотов ©   (03.03.05 21:23) [2] и попробуй доказать что в его примере не выделено 10 000 000 хендлов.


 
Юрий Зотов ©   (2005-03-03 23:17) [10]

Блин, а ведь и правда не все так просто. Вот легкая модификация кода:

procedure TForm1.FormClick(Sender: TObject);
var
 i: integer;
begin
 Caption := "";
 with TObjectList.Create do
 try
   for i := 1 to 100000 do
     TMemoryStream(Items[Add(TMemoryStream.Create)]).Write(Tag, 1);
 finally
   Caption := IntToStr(Count);
   Free
 end
end;


Результатов два:
1. Скорость исполнения упала на пару порядков, хотя цикл был оптимизирован. Ну, примерно это, в общем-то и ожидалось
2. 65537 - out of memory. А вот это уже сюрприз.

Вывод - надо лезть в код VCL. И цифра настораживает - слишком близко к High(word). Не фокусы ли это менеджера памяти?


 
jack128 ©   (2005-03-03 23:17) [11]

Anatoly Podgoretsky ©   (03.03.05 22:53) [9]
попробуй доказать что в его примере не выделено 10 000 000 хендлов


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

Мне вот только одно не понятно, а почему для MemoryStream для выделения памяти используются Global* функции, а не стандартные GemMem/FreeMem или Heap или Virtual* ?? В мсдн написано, что эти функции медленнее Heap*


 
jack128 ©   (2005-03-03 23:19) [12]

jack128 ©   (03.03.05 23:17) [11]
В мсдн написано, что эти функции медленнее Heap*

ЭТИ - имеется в виду Global. Я так понимаю, что они оставлены только для совместимости с 16bit Windows



Страницы: 1 вся ветка

Текущий архив: 2005.03.20;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.053 c
4-1107731888
romshtain
2005-02-07 02:18
2005.03.20
Как отловить хендл окна, которое находится..


14-1109851963
DiamondShark
2005-03-03 15:12
2005.03.20
Беглый взгляд на первую страницу.


3-1108568740
juice
2005-02-16 18:45
2005.03.20
CREATE TABLE в хранимой процедуре


3-1106562435
Shizuku
2005-01-24 13:27
2005.03.20
Монитор SQL


3-1108966665
Ann
2005-02-21 09:17
2005.03.20
Распечатка структуры таблиц Paradox