Форум: "Основная";
Текущий архив: 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