Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Komprimiertes Archiv multithreaded erstellen? (https://www.delphipraxis.net/202546-komprimiertes-archiv-multithreaded-erstellen.html)

dummzeuch 15. Nov 2019 17:31

Komprimiertes Archiv multithreaded erstellen?
 
Wir haben manchmal das Problem, dass wir zusammengehörige Dateien, die unkomprimiert recht gross sind, als komprimiertes Archiv verschicken (bzw. auf einen Server hochladen) muessen.

Bisher erstellen wir ZIP-Dateien und verwenden dazu die 7zip-DLL und das funktioniert auch ganz gut.

Leider dauert das Erstellen des Archivs bei großen Dateien extrem lange, weil alles in einem einzelnen Thread läuft. Der Rechner ist ein (echter) 8-Kerner, d.h. durch Multithreading könnte man den Vorgang wahrscheinlich deutlich beschleunigen.

Anforderung ist, dass die Erstellung des Archivs aus einem Delphi-Programm heraus angestoßen werden kann. Schön wäre, wenn das nicht per Kommandozeile sondern mittels einer DLL geschähe, so dass man einen Fortschrit in der GUI anzeigen kann.

Gibt es da was?

p80286 15. Nov 2019 18:14

AW: Komprimiertes Archiv multithreaded erstellen?
 
Wie wäre es mit 7Zip? Angeblich (https://de.wikipedia.org/wiki/7-Zip) ist da multithreading möglich.
Auch DLL sind verfügbar (https://forum.lazarus.freepascal.org...?topic=28811.0) und Nein ich habe damit keine praktische Erfahrung. Vielleicht findest Du da was Du suchst.

Gruß
K-H

TurboMagic 15. Nov 2019 19:13

AW: Komprimiertes Archiv multithreaded erstellen?
 
Du hast gelesen, dass der OP schon die 7zip DLL benutzt? ;-)

Redeemer 15. Nov 2019 19:19

AW: Komprimiertes Archiv multithreaded erstellen?
 
Benutzt du auch LZMA2 als Verfahren?

p80286 15. Nov 2019 20:20

AW: Komprimiertes Archiv multithreaded erstellen?
 
Zitat:

Zitat von TurboMagic (Beitrag 1451390)
Du hast gelesen, dass der OP schon die 7zip DLL benutzt? ;-)

:shock: eh nee, verlesen:oops:

Gruß
K-H

DieDolly 16. Nov 2019 10:21

AW: Komprimiertes Archiv multithreaded erstellen?
 
Bei 7z kann man mehrere Kompressionsthreads so angeben (benötigt JCL)
Delphi-Quellcode:
 CompressFormat := GetArchiveFormats.FindUpdateFormat('datei.7z');

 if CompressFormat <> nil then
  begin
    if (CompressArchive.ClassType = JclCompression.TJcl7zCompressArchive) or (CompressArchive.ClassType = JclCompression.TJcl7zUpdateArchive) then
     begin
      CompressArchive := CompressFormat.Create('datei.7z');

      // >>>
      (CompressArchive as TJcl7zUpdateArchive).SetNumberOfThreads(4);
      // <<<

      ...........
     end;
  end;

dummzeuch 16. Nov 2019 11:44

AW: Komprimiertes Archiv multithreaded erstellen?
 
Zitat:

Zitat von DieDolly (Beitrag 1451404)
Bei 7z kann man mehrere Kompressionsthreads so angeben (benötigt JCL)

Cool, hatte ich bisher übersehen. Dann wären die notwendigen Änderungen ja minimal.

Wenn ich das richtig interpretiere, gilt das aber nur für das 7z-Format und nicht für ZIP, korrekt?

DieDolly 16. Nov 2019 11:45

AW: Komprimiertes Archiv multithreaded erstellen?
 
Für ZIP sieht das so aus
Delphi-Quellcode:
if (CompressArchive.ClassType = JclCompression.TJclZipCompressArchive) or (CompressArchive.ClassType = JclCompression.TJclZipUpdateArchive) then
 begin
  (CompressArchive as TJclZipUpdateArchive).SetNumberOfThreads(4);
Gerne würde ich noch mehr helfen. Aber ich bin was JCL/7z angeht leider auch kein Profi.

Was der Delphi-Gemeinschaft enorm helfen würde, wäre ein Tutorial, wie man 7z korrekt und komplett mit JCL verwendet.

Insgesamt kann die JCL 7z Implementierung
Zitat:

TJclZipCompressArchive handled by sevenzip http://sevenzip.sourceforge.net/
| |-- TJclBZ2CompressArchive handled by sevenzip http://sevenzip.sourceforge.net/
| |-- TJcl7zCompressArchive handled by sevenzip http://sevenzip.sourceforge.net/
| |-- TJclTarCompressArchive handled by sevenzip http://sevenzip.sourceforge.net/
| |-- TJclGZipCompressArchive handled by sevenzip http://sevenzip.sourceforge.net/
| |-- TJclXzCompressArchive handled by sevenzip http://sevenzip.sourceforge.net/
| |-- TJclSwfcCompressArchive handled by sevenzip http://sevenzip.sourceforge.net/
| |-- TJclWimCompressArchive
Jede hat ihre eigenen Eigenschaften. Welcher Modus was kann, kann man super in der 7z-GUI (neues Archiv) testen.

Kleiner Hinweis noch. http://sevenzip.sourceforge.net/ ist veraltet. die aktuelle URL ist http://sevenzip.sourceforge.net/

Uwe Raabe 16. Nov 2019 12:07

AW: Komprimiertes Archiv multithreaded erstellen?
 
Zitat:

Zitat von DieDolly (Beitrag 1451409)

:gruebel:

DieDolly 16. Nov 2019 12:38

AW: Komprimiertes Archiv multithreaded erstellen?
 
Das nenne ich einen super Fehler von mir.

Ich meine natürlich https://www.7-zip.org/


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:56 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf