Morgen zusammen,
folgendes Problem: Habe eine VST mit SEHR VIELEN Zeilen, die ich via VST.savetostream in einen Filestream speichere. Bei sehr großen Datenmengen wird die gespeicherte Datei allerdings schnell mal 1GB groß = unverhältnismäßig groß für reine Textdaten. Daher habe ich eine bei den Schweizern gefundene Streamkomprimierung eingebaut. Letztere übergibt den komprimierten Stream allerdings an TMemorystream; folglich habe ich VST.savetostream zunächst an TMemorystream übergeben, um es dann zu komprimieren und dann zu speichern (via Umleitung in TFilestream). Leider scheint das speichern der VST-Daten in TMemorystream unendlich viel langsamer zu sein bzw. kommt nie zum Ende; hat jemand eine Ahnung warum bzw. wie ich das umgehen könnte (außer zuerst unkomprimiert in TFilestream zu speichern, dann wieder zu laden, zu komprimieren und wieder zu speichern..)?
Das ist der relevante Code:
Delphi-Quellcode:
uses ZLib;
procedure CompressStream(inpStream, outStream: TStream);
var
InpBuf, OutBuf: Pointer;
InpBytes, OutBytes: Integer;
begin
InpBuf :=
nil;
OutBuf :=
nil;
try
GetMem(InpBuf, inpStream.Size);
inpStream.Position := 0;
InpBytes := inpStream.
Read(InpBuf^, inpStream.Size);
CompressBuf(InpBuf, InpBytes, OutBuf, OutBytes);
outStream.
Write(OutBuf^, OutBytes);
finally
if InpBuf <>
nil then FreeMem(InpBuf);
if OutBuf <>
nil then FreeMem(OutBuf);
end;
end;
procedure TForm1.Button8Click(Sender: TObject);
var
kompstream: tstream;
stream: TMemorystream;
begin
stream:= TMemoryStream.Create;
kompstream:= TFileStream.Create(savedlg2.filename, fmCreate);
try
vst.SaveToStream(stream);
CompressStream(stream, kompstream);
finally
stream.free;
kompstream.Free;
end;
end;
Danke und Euch allen ein schönes WE,
Frieder