![]() |
Effiziente Kompressionsverfahren
Hallo zusammen,
ich suche effiziente OpenSource-Kompressionsverfahren (z.B. 7Zip) für mein aktuelles Delphi-Projekt. Diese sollten folgende Punkte erfüllen (der Priorität nach geordnet):
Ach ja: CompressionStream bzw. (De)CompressBuf (Unit ZLib) ist mir schon bekannt :wink: Danke für eure Postings! Grüße, Marco |
Re: Effiziente Kompressionsverfahren
Wie wäre es mit einem
![]() |
Re: Effiziente Kompressionsverfahren
Besser geht es kaum.
|
Re: Effiziente Kompressionsverfahren
7Zip ist übrigens OpneSource, so weit ich weiß. Das sollte eigentlich alle deine Wünsche erfüllen.
|
Re: Effiziente Kompressionsverfahren
Hallo Michael,
Zitat:
Marco |
Re: Effiziente Kompressionsverfahren
|
Re: Effiziente Kompressionsverfahren
Zitat:
![]() [edit] Schon wieder so ein toter Kasten [/edit] |
Re: Effiziente Kompressionsverfahren
Danke Manuel!
Dann werd ich mich mal ran machen. Für weitere Krompressionsverfahren bin ich natütlich auch weiterhin offen. :wink: Gruß + Dank, Marco |
Re: Effiziente Kompressionsverfahren
Generische Kompressionsverfahren ohne Wissen ueber die Daten gibt es eigentlcih keine anderen.
Die Huffman-Familie mit Zlib als freie Variante und die arithmetische mit bzip2 (unf glaube ich 7zip). Es kann kein effizienteres Verfahren geben ohne Information ueber die Daten. MPEG z. B. nutzt die Aehnlichkeit aufeinanderfolgender Bilder. |
Re: Effiziente Kompressionsverfahren
Der hier in der Codelibrary gepostete Huffman Algorithmus hat Nichts, aber auch gar Nichts mit effektiven Kompressionsverfahren und inbesondere dem adaptiven Huffman Coding zu tun. Er implementiert den einfachen Brute Force Entropieverdichter, ein netter Algorithmus zum Üben, er eignet sich jedoch überhaupt nicht für den praktischen Einsatz. Ich weiss nicht, wieso das keiner ausprobiert.
Ich habe hier eine 110MB Datenbank (MSSQL), die sich wunderbar verdichten lässt. Die Kompressionsrate von 'Hufman' liegt bei ca 55%. Das ist schlecht. Sehr schlecht. Wie man dann behaupten kann, besser ginge es nicht, der kennt wohl kein LZW, LZSS oder BZIP usw. RAR (adaptives Huffman Coding) kommt auf 95%, Pkzip auf 91%. Zlib liegt gleich auf, was daran liegt, das die in PKZIP verwendeten Verfahren implementiert wurden. Lz Ich verwende in meinen Applikationen Zlib, da die Geschwindigkeit ordendlich und die erzielten Kompressionsraten ausreichend sind. Ich würde RAR nehmen, aber leider gibt es den Packer, soweit ich weiss, nicht als Code. BZIP (oder Markov) soll zwar besser sein, die mir vorliegende Sourcen schaffen das aber nicht. |
Re: Effiziente Kompressionsverfahren
Zitat:
Dust Signs |
Re: Effiziente Kompressionsverfahren
@Dust Signs: Bitte zitiere doch nur den Teil des Beitrags, den du für deine Stellungnahme auch benötigst, das liest sich deutlich besser, danke.
Zitat:
Ich denke allerdings auch, dass Schnelligkeit und eine hohe Kompression einen Widerspruch darstellen. Je besser die Kompression, desto länger dauert das Komprimieren. Zumindest habe ich es bei den Kompressionsprogrammen, die ich nutze so festgestellt. |
Re: Effiziente Kompressionsverfahren
Zitat:
Wo wir schon dabei sind, darf ich wieder mit meinen obligatorischen non-PC-Plattformen kommen? :stupid: Man könnte ja Kompressionsalgorithmen in Hardware gießen, idR schneller als auf einem RISC ;-) |
Re: Effiziente Kompressionsverfahren
Liste der Anhänge anzeigen (Anzahl: 1)
@Dust Signs: Ich habe das 'schnell' schon gelesen. RAR ist schon ok, schneller als die mir vorliegende zlib-Version, soweit ich mich erinnere. Natürlich nicht so schnell wie PKZIP, aber ausreichend. Da die Kompressionsrate von RAR jedoch unerreicht ist, kommt RAR für mich als perfekter Kandidat in Betracht. Aber, das ist Geschmacksache. Wichtig war mir, das hier Dinge gepostet werden, ohne sie mal nachzuprüfen.
Von der Schnelligkeit her würde ich LZW Verfahren nehmen. Das ist sauschnell. Aber eben nicht sonderlich effizient. Probier das hier mal aus. Das ist zwar nur Delphi (kein ASM), aber geht wirklich ab wie Sau. Vielleicht reicht es Dir ja. Ich habe auch den LZH Code als Delphi-Version probiert. Aber der ist einfach zu langsam. |
Re: Effiziente Kompressionsverfahren
Hallo zusammen,
danke erstmal für die rege Beteiligung! :thumb: Zitat:
Zitat:
Zitat:
Zitat:
Bisher dachte ich jedenfalls, Delphi langt von der Performance her knapp an C(++) heran. Zitat:
Gruß, Marco |
Re: Effiziente Kompressionsverfahren
Liste der Anhänge anzeigen (Anzahl: 1)
Was PKZIP und zlib anbelangt, darfst Du nicht vergessen, das der gute Phillip Katz ('PK') sich einen abgebrochen hat, damit sein Tool die #1 wird. Also hat er optimiert, was das Zeug hält. Zlib ist 'nur' eine normale ASM-Implementierung, die natürlich noch Optimierungspotential hat. Beim LZW-Algorithmus z.B. gibt es ein Wörterbuch, das immer weiter wächst. Irgendwann wird es zu gross und muss 'bereinigt' werden. Ich meine, das PkWare das genaue WIE und WANN der 'Dictionary-Reinigung' nicht verraten. Gerade DAS macht aber noch einige Prozente in der Komprimierungsrate aus.
Die Geschwindigkeit von zlib hat m.E. nichts mit Delphi vs. C(++) zu tun, sondern mit Algorithmen und Optimierungen: "Ein BubbleSort in ASM ist immer langsamer als ein Quicksort in JavaScript." (Gut, bei mehr als 1000 Elementen :-D ) Teste einfach mal zlib. Ich weiss nicht, welche Version Du hast. Ich habe die hier und mir reichts (ich wiederhole mich) |
Re: Effiziente Kompressionsverfahren
Zitat:
read you, Dax |
Re: Effiziente Kompressionsverfahren
|
Re: Effiziente Kompressionsverfahren
Ach Heinz ;) Wie Die Huffman-Kodierung funktioniert weiß ich :) Ich wollt aber was zu adaptive Variante erfahren, und dazu hab ich nix gefunden :?
|
Re: Effiziente Kompressionsverfahren
Liste der Anhänge anzeigen (Anzahl: 1)
Ich wollte Dir nix Böses :oops:. Es geht ja bei Verfahren erst in zweiter Linie ums Optimieren. Wenn das Verfahren nicht stimmt, dann bringt 'Optimieren' hier auch Nichts. Deine Hufman-Implementierung is ordendlich, darauf kommt es an. Allerdings sollte man schon mal Vergleiche mit in freier Wildbahn auftretenden Packern machen, bevor man euphorisch die Implementierung des Hufman feiert. Aber egal.
Ich habe leider keine akkuraten Beschreibungen oder Listings zum RAR-Verfahren. Das LZH-Verfahren kann ich Dir geben... Der 'Nachteil' vom von Dir implementierten 'statischen' Huffman Codiung ist: 1. Du musst den KodierungsBaum mitschicken. 2. Du berücksichtigst die Verteilung der Bytes nur in der gesamten Datei. So, wie ich das verstanden habe, fängt der 'adaptive Hufman' mit einem standardisierten Kodierungsbaum an (Es gibt ein Listing für UNRAR, da steht er drin). Somit entfält Nachteil #1. Dann wird während des Kodierens der Kodierungsbaum immer wieder überarbeitet, um die aktuelle Bytehäufigkeit zu berücksichtigen. Somit entfällt Nachteil #2. Vermutlich stecken noch ettliche kleine 'Optimierungen' drin, um auf diese Kompressionsraten zu kommen: Trivial ist das nämlich nicht. Am Spannendsten finde ich jedoch die Markov-Verfahren, die doch tatsächlich darauf aufbauen, das nächste Byte zu 'erraten'. Das klappt sogar. Unglaublich. Leider auch extrem langsam. Hier das LZH-Verfahren (Ziemlich laaaangsam) |
Re: Effiziente Kompressionsverfahren
Danke, ich sehs mir mal an :)
BtW: Ich habe den Huffman nicht implementiert, das war ein anderes fähiges angemeldetes Wesen ;) read you, Dax |
Re: Effiziente Kompressionsverfahren
Ich sehe grad, dass es um schnelle compression geht :) Also ich koennte hier noch
![]() empfehlen, der macht sich gut und ist open source. und auch noch klein. Folgendes wird erfuellt
ich nutze den oefter fuer kleinere datenbanken und aehnliches, die in einen eigen format gespeichert werden. cheers, neogen :) PS: download ![]() |
Re: Effiziente Kompressionsverfahren
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen!
Ich habe ein kleines Testprojekt zum Vergleichen der vielen vorgeschlagenen Kompressionsverfahren geschrieben (siehe Anhang). Zwei Probleme:
Gruß, Marco |
Re: Effiziente Kompressionsverfahren
Liste der Anhänge anzeigen (Anzahl: 1)
Das von mir vorgeschlagene Verfahren funktioniert nur in Chunks à 32k (oder 64?). Schau einfach in den Code, dann siehst Du die Words. Wenn Du deine Daten so aufteilst, dann klappt das. Dann ist der Output eben immer ein Tupel (Länge, DATA) und nicht ein einziger Stream.
Übrigens ist es nicht 'fair' ein Kompressionsverfahren auf Zufallsdaten anzuwenden. Ein perfekter Zufallszahlengenerator zeichnet sich ja gerade dadurch aus, das er keine Redundanz erzeugt. Es wird sogar gemunkelt, das das Ergebnis einer Kompression (also der bytestrom) als sehr perfekter Randomgenerator taugt. Viele Kompressionsverfahren, die in der freien Wildbahn recht schnell sind, beissen sich performancemässig an Zufallszahlen die Zähne aus. Nimm doch lieber Sourcecode oder irgendwelche EXE-files. Ich habe dein testprogramm ein wenig modifiziert, damit 'mein' Kompressor auch zum Zug kommen kann und siehe da: Er versagt bei random-dateien und liegt ansonsten zwischen Huffman und zlib. Ich habe einfach die EXE als Input genommen. |
Re: Effiziente Kompressionsverfahren
@alzaimar: Könntest du uU eine EXE hochladen? Hab grade kein Delphi da und würde mir das gerne mal ansehen
Vielen Dank Dust Signs |
Re: Effiziente Kompressionsverfahren
Liste der Anhänge anzeigen (Anzahl: 1)
Es wäre zuckersüß einen Beitrag einzugeben, nur um auf den Attachment hinzufügen-Button drücken zu dürfen?... seltsam
|
Re: Effiziente Kompressionsverfahren
Liste der Anhänge anzeigen (Anzahl: 1)
@Vjay: PrecTimer war im vorherigen Attachment drin und bei mir aus Gründen, die meinem Nick zu entnehmen sind, nicht. Unabhängig davon verstehe ich deine Zeilen nicht, aber der Sinn wird über die PNG klar.
@Dust Signs & Rest: Exe im Anhang |
Re: Effiziente Kompressionsverfahren
Zitat:
Dust Signs |
Re: Effiziente Kompressionsverfahren
Liste der Anhänge anzeigen (Anzahl: 1)
Du wolltest nur die EXE, von DLL war keine Rede. Gibts nur gegen Aufpreis. Und überhaupt, sei nich so pingelig, is ja furchbar :mrgreen:
|
Re: Effiziente Kompressionsverfahren
Liste der Anhänge anzeigen (Anzahl: 2)
Hab dann noch bzlib2 eingefügt.
Zitat:
|
Re: Effiziente Kompressionsverfahren
Hallo zusammen,
danke für die rege Beteiligung... Hätte ich nicht erwartet :-D Zitat:
So zufällig sind die Daten ja eben gar nicht, was man auch an der Kompressionsrate sehen kann/konnte. Zitat:
Zitat:
Mal sehen, vielleicht werde ich bei Gelegenheit auch noch 7Zip "verbauen"... Werd mich mal im Inno Setup Source schlau machen... :mrgreen: Grüße, Marco |
Re: Effiziente Kompressionsverfahren
Ich bins nochmal...
Hat vielleicht jemand eine Idee, was bei JCALG1 schief läuft? Hat ja die beste Kompression, aber für einen hochoptimierten ASM-Algorithmus sieht das performancemäßig ja nicht gerade aus: Über fünf Sekunden braucht das Ding für 51% Kompression bei mir :gruebel: Gruß, Marco |
Re: Effiziente Kompressionsverfahren
No ideas? :hi:
|
Re: Effiziente Kompressionsverfahren
DEr JCALG1 Algorithmus implementiert den LZSS-Algorithmus. Das ist (soweit ich das korrekt überflogen habe) ein LZW mit zusätzlichem 'sliding window'. Entweder wird eine Zeichenkette als eintrag im Wörterbuch (LZW) kodiert, oder als "jetz kommen X Zeichen, die auch schon an Y Zeichen vorher vorkamen" kodiert wird. Je nachdem, was kürzer ist.
Ich habe mir die Implementierung von JCALG nicht angeschaut, aber könnte mir vorstellen, das das sliding Window nicht optimal umgesetzt wird. Im Übrigen bringt der JCALG1 bei mir nicht die besten Ergebnisse. Hier ist zlib vorne. Da es zudem schnell genug ist, würde ich das benutzen. Tu ich ja auch. |
Re: Effiziente Kompressionsverfahren
Hallo zusammen,
Zitat:
@neogen: Du bist jetzt besonders angesprochen :tongue: Schnell ist der JCALG1 eben nicht. Mach ich was falsch?! Grüße, Marco |
Re: Effiziente Kompressionsverfahren
Latürnich ZlibEx... Ich meinte das eher als "die Z-Lib(rary)"
|
Re: Effiziente Kompressionsverfahren
Hallo alzaimar,
Zitat:
Gruß, Marco |
Re: Effiziente Kompressionsverfahren
Mann, hast Du mich jetzt durcheinander gebracht. Ich wusste gar nicht, das zlib bei delphi mit dabei ist...
Natürlich die ZLibex. |
Re: Effiziente Kompressionsverfahren
:-D Sowas auch :nerd: :wink:
|
ComCom
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo zusammen,
endlich habe ich mal wieder etwas länger Zeit gehabt und das Projekt ziemlich umfangreich überarbeitet. Neben einigen neuen nützlichen Features habe ich auch die neueste Version von ZLibEx, 1.2.2, hinzugefügt. Ich freue mich über euer Feedback! :thumb: Gruß, Marco P.S.: Falls ihr etwas im Projekt ändert und hier hochladet, setzt doch bitte die Ausgabe-Versionsnummer um eins hoch. Danke! :-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz