Форум: "Основная";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];
ВнизСколько 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.039 c