Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2014.11.23;
Скачать: [xml.tar.bz2];

Вниз

запись объектов в Stream..   Найти похожие ветки 

 
istok20 ©   (2012-02-08 20:16) [0]

есть структура (objectlist) объектов, которую надо писать\читать в наследника TStream, везде использую TMemoryStream.
при большом кол-ве объектов (каждый имеет данных на 2кб, а всего их в критичном случае 5-10 тысяч), сохранение данных в stream проходит очень медленно. чтение же идет быстро.

при сохранении делается запись  размера каждого объекта (может быть разной) и добавление данных в один большой stream на выходе, вот эта функция и тормозит:


procedure AddToComboStream(Source, Dest: TStream);
var
 Size: Integer;
begin
 Source.Position := 0 ;
 // Сохраняем размер, помещая его в первый байт
 Size := Source.Size ;
 Dest.Write(Size, SizeOf(Size));
 Dest.CopyFrom(Source, 0);
//  Dest.Write((Source as TMemoryStream).Memory^, Source.Size); - пробовал, толку ноль.
end;

читаю вот это ф-цией:


function GetFromComboStream2(Source, Dest: TStream; Index: Integer): Boolean;
var
 Size, I: Integer;
begin
 try
   if Index > 0 then
     For i := 0 to Index-1 do
      begin
        Source.Read(Size, SizeOf(Integer));
        Source.Position := Source.Position + Size ;
      end;
   // Если маркёр в файле равен размеру, то что-то пошло не так :(
   if Source.Position = Source.Size then
     Abort;
   {  raise} //Exception.CreateFmt("GetFromStream: Index = %d Out Of Bounds", [Index]) ;
   // Получаем желаемый размер файла
   Source.Read(Size, SizeOf(Size));

   if (Source.Size - Source.Position) < Size then
     Abort;

   Dest.CopyFrom(Source, Size);
   Result := True;
 except
   Result := False;
 end;
end;


это мемори стрим медленный или у меня руки кривые и можно как-то "прямее" сохранить объекты в stream?


 
istok20 ©   (2012-02-08 20:18) [1]

ну т.е. я наслышан что memorystream медленный, но можно ли здесь серьезно  ускориться, всё же используя его?


 
~AQUARIUS~   (2012-02-08 20:34) [2]

Установите Stream.Size до начала записи в общий необходимый размер. Тормоза, скорее всего, изза постоянного перевыделения памяти


 
istok20 ©   (2012-02-08 20:37) [3]

ремарка: AddToComboStream вызывается 5-10 тыщ раз

вы имеете в виду размер итогового большого стрима, да?


 
istok20 ©   (2012-02-08 21:27) [4]

да, с Size помогло, спасибо)

осталось научиться правильно вычислять величину этого Size ))


 
Сергей М. ©   (2012-02-08 22:00) [5]


>         Source.Read(Size, SizeOf(Integer)); // в результате успешного выполнения метода позишн увеличится на сайз
>         Source.Position := Source.Position + Size ; // посему эта строка - бестолковое телодвидение


 
bems ©   (2012-02-09 00:49) [6]

> Установите Stream.Size до начала записи в общий необходимый размер. Тормоза, скорее всего, изза постоянного перевыделения памяти
наверное имелось в виду Capacity


 
MBo ©   (2012-02-09 05:39) [7]

>bems
Capacity у MemoryStream скрыто, а у родителя вообще отсутствует.

В данном случае SetSize его сам устанавливает


 
icWasya ©   (2012-02-09 12:47) [8]

>Capacity у MemoryStream скрыто, а у родителя вообще отсутствует.
Показываю

type
TMemoryStreamWithCapacity = class(TMemoryStream);

...
TMemoryStreamWithCapacity(Dest).Capacity:=10240;



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

Форум: "Основная";
Текущий архив: 2014.11.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.002 c
2-1385310079
вова
2013-11-24 20:21
2014.11.23
Invalid Pointer operation


15-1397165027
Webdesigner
2014-04-11 01:23
2014.11.23
Редактирование статей на сайте без входа в админку


2-1384856662
Вася
2013-11-19 14:24
2014.11.23
как быстро записывать побайтно в файл?


15-1395400552
Дмитрий СС
2014-03-21 15:15
2014.11.23
Подключение двигателя по CanOpen(Cia 402)


2-1378879113
Леван
2013-09-11 09:58
2014.11.23
TDBCtrlGrid - как создавать динамически?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский