Einzelnen Beitrag anzeigen

maanton

Registriert seit: 10. Sep 2007
16 Beiträge
 
#1

Hohe Ressourcennutzung bei Verwendung von ZLIB (ZLIBEX)

  Alt 25. Feb 2008, 16:04
Hallo !

Ich kämpfe gerade mit der ZlibEX in Delphi 6 herum . Hab auch schon im Netz gesucht... .

Problem : Mein Programm soll verschiedene, auch grosse Zip-Dateien (mit grossen Dateien drin) dekomprimieren können (> 1GB, spaeter eigenes "Format" > 2GB), der ausführende Rechner hat jedoch mit Sicherheit nicht soviel Speicher.

Performance ist hier nicht unbedingt ein Thema.
Essentiell ist, dass während des Entpackens dieses durch <ESC> abgebrochen werden kann (also Tastendruck, Aufruf MessageHandler,...) und Bildschirmaktualisierung (Laufbalken, Restzeit,...) durchgeführt wird.

Die Beispiele, welche ich gefunden habe arbeiten so (ich schenk mir jetzt den "Balast" drumherum):

...
var MemStream : TMemoryStream;
DateiStream : TStream;
Dekompr : TZDecopressionStream;
UnkompGroesse : integer;
sBuffer : string;
...
begin
// DateiStream.Create;
MemStream := TMemoryStream.Create;
if (ZipEintrag.GetComprDaten(MemStream) > 0 then begin {wenn Daten da und Init der internen Daten}
UnkompGroesse := ZipEintrag.SizeUncompressed;
Decompr := TZDecomressionStream.Create(MemStream); <- Hier Speicherbelastung
nGelesen := Decompr.Read(sBuffer[1],UnkompGroesse); {Lesen, Entpacken und in SBuffer schreiben}
DateiStream.Write(sBuffer[1],UnkompGroesse);
Decompr.Free;
end;
MemStream.Free;
// DateiStream.Free;
end;

Funktioniert fantastisch. Und alles in einem Rutsch. Leider wird hierbei das Memory des Rechners mit Speichergebrauch der Grösse der Daten belastet.

Wie geht sowas blockweise? Gibts dafür ein CodeSample und wenn ja wo?

Z.B.
...
//Grundeinstellungen : Positionieren auf Zip-Datei als TFilestream, Einlesen der Grunddaten
While not EndeZipeintrag()
// Lese 64k Block
// Dekomprimier ihn
// Abbruch prüfen, Bildschirm aktualisieren
// schreib raus
end;
// Aufräumen

Gruss
  Mit Zitat antworten Zitat