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

Вниз

запись объектов в 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;
Скачать: CL | DM;

Наверх




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


2-1385142359
Koudelka
2013-11-22 21:45
2014.11.23
DELPHI 7:Как вывести в label текущее число записей таблицы DBGrid


3-1301315020
samalex2504
2011-03-28 16:23
2014.11.23
В IB связать, отфильтровать и вывести несколько больших ХП


6-1234378196
smail
2009-02-11 21:49
2014.11.23
как передать сообщение клиенту?


2-1384891964
Alex_C
2013-11-20 00:12
2014.11.23
Массив по указателю