Einzelnen Beitrag anzeigen

friedemann2009

Registriert seit: 10. Feb 2010
49 Beiträge
 
#1

Komprimiertes Speichern von Virtual Stringtree / Stream

  Alt 13. Aug 2011, 08:57
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
  Mit Zitat antworten Zitat