![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
запись объектов в Stream.. [D7]
istok20 © (2012-02-08 20:16:00)есть структура (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?
icWasya (2012-02-09 12:47:00) [1]>Capacity у MemoryStream скрыто, а у родителя вообще отсутствует.
Показываю
type
TMemoryStreamWithCapacity = class(TMemoryStream) ;
...
TMemoryStreamWithCapacity(Dest).Capacity:=10240;
MBo (2012-02-09 05:39:00) [2]>bems
Capacity у MemoryStream скрыто, а у родителя вообще отсутствует.
В данном случае SetSize его сам устанавливает
bems (2012-02-09 00:49:00) [3]> Установите Stream.Size до начала записи в общий необходимый размер. Тормоза, скорее всего, изза постоянного перевыделения памяти
наверное имелось в виду Capacity
Сергей М. (2012-02-08 22:00:00) [4]
> Source.Read(Size, SizeOf(Integer)); // в результате успешного выполнения метода позишн увеличится на сайз
> Source.Position := Source.Position + Size ; // посему эта строка - бестолковое телодвидение
istok20 (2012-02-08 21:27:00) [5]да, с Size помогло, спасибо)
осталось научиться правильно вычислять величину этого Size ))
istok20 (2012-02-08 20:37:00) [6]ремарка: AddToComboStream вызывается 5-10 тыщ раз
вы имеете в виду размер итогового большого стрима, да?
~AQUARIUS~ (2012-02-08 20:34:00) [7]Установите Stream.Size до начала записи в общий необходимый размер. Тормоза, скорее всего, изза постоянного перевыделения памяти
istok20 (2012-02-08 20:18:00) [8]ну т.е. я наслышан что memorystream медленный, но можно ли здесь серьезно ускориться, всё же используя его?