Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
6-1105643974
Бульдозер
2005-01-13 22:19
2005.03.20
Сетевая программа на чистом WinSock


14-1109698930
Delta
2005-03-01 20:42
2005.03.20
Canvas


9-1103563229
Макс
2004-12-20 20:20
2005.03.20
Ландшафт.


4-1107508368
KostR
2005-02-04 12:12
2005.03.20
Что я делаю не так при чтении с последовательного порта


6-1105707982
begemon
2005-01-14 16:06
2005.03.20
Как определить момент, когда модем установил соединение





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский