Byte-Quetscher

Das mittlerweile gut zehn Jahre alte Kompressionsverfahren LZMA erfreut sich wachsender Beliebtheit. Allerdings hat sich bislang kein einheitliches Dateiformat herauskristallisiert: Fast jedes Programm verwendet sein eigenes.

In Pocket speichern vorlesen Druckansicht 5 Kommentare lesen
Lesezeit: 5 Min.
Von
  • Michael Riepe

Es kommt Bewegung in die Evolutionsleiter der Kompressionsalgorithmen. Lange war bzip2 das Mittel der Wahl, wenn es darum ging, Dateien ohne Informationsverlust so stark wie möglich zusammenzuquetschen. Doch Programme auf der Grundlage des Lempel-Ziv-Markow-Algorithmus (LZMA) schicken sich an, ihm den Rang abzulaufen.

LZMA gehört zur Familie der von compress und zip respektive gzip bekannten Lempel-Ziv-Kompressionsverfahren. Sie ersetzen mehrfach vorkommende Byte-Folgen durch Verweise auf ein Wörterbuch (sliding dictionary). Modernere Varianten reduzieren die Datenmenge durch eine Entropiekodierung noch weiter, etwa mit einem Huffman-Code. LZMA verwendet zusätzlich sogenannte Markow-Ketten und erreicht damit Kompressionsraten, die zum Teil deutlich über denen von bzip2 liegen.

Während der Algorithmus beim Komprimieren relativ viel Rechenleistung und Hauptspeicher benötigt – deutlich mehr als bzip2 –, kommt er beim Auspacken mit einem Bruchteil der Ressourcen aus. Er eignet sich daher vor allem für Daten, die öfter aus- als eingepackt werden. OpenSUSE etwa nutzt ihn seit Version 11 zum Komprimieren der "Nutzlast" von RPM-Softwarepaketen.

Verbreitung erlangte LZMA vor allem durch das Windows-Archivierungspaket 7-Zip und dessen Dateiformat "7z". Unter dem Namen p7zip ist eine Version für POSIX-kompatible Systeme erhältlich. Außerdem gibt es eine Java-Implementierung (J7zip). Alle Programme sowie das dazugehörige SDK für C, C++, C# und Java stehen unter Open-Source-Lizenzen, die meisten unter der GNU Lesser General Public License (LGPL), die den Einsatz in kommerziellen Produkten ohne Weitergabe deren Quelltextes erlaubt.

Allerdings ist das 7z-Format für Unix-Systeme weniger geeignet, weil es nicht alle Metadaten speichert. Wer etwa beim Backup den Eigentümer einer Datei mitsichern will, muss erst ein tar-Archiv erstellen und es anschließend mit 7z komprimieren.

Mehr "Unix-like" funktioniert das Programm lzip. Da es alle für Kompressionsprogramme typischen Optionen versteht, lässt es sich mit wenig Aufwand anstelle von gzip oder bzip2 einsetzen. Wer die GNU-Version von tar einsetzt, kann mit tar –cf archiv.tar.lz - -use-compress-program=lzip <dateien> ein komprimiertes Archiv in einem Arbeitsgang erzeugen.

Das von lzip verwendete Dateiformat enthält die Länge und eine CRC-Prüfsumme (Cyclic Redundancy Check) der unkomprimierten Daten, jedoch im Gegensatz zum gzip-Format keine weiteren Metadaten wie Dateiname oder Erstellungsdatum. Wer das lzip-Format in eigenen Programmen verwenden will, kann sich der Bibliothek lzlib bedienen.

Viele Linux-Distributionen enthalten das Paket LZMA-Utils. Es basiert auf dem 7-Zip-SDK und enthält neben den Programmen lzma, unlzma und lzcat diverse Skripte als Arbeitshilfen: lzdiff und lzcmp vergleichen komprimierte und unkomprimierte Dateien, lzmore zeigt ihren Inhalt an und lzgrep erlaubt es, nach Zeichenketten zu suchen. Allerdings verwenden die komprimierten Dateien mit der Endung .lzma wiederum ein anderes Format als 7z und lzip, sodass keins der Programme die Dateien des anderen lesen kann.

Außerdem gab es in der Vergangenheit mehrere Versionen des Formats. Das soll sich mit dem lzma-Nachfolger xz ändern, der momentan als Beta vorliegt – um den Preis noch einer neuen Version. Die allerdings hat es in sich, denn sie unterstützt neben einer verbesserten LZMA-Variante namens LZMA2 bis zu drei zusätzliche Verarbeitungsschritte, sogenannte Filter, die bei bestimmten Daten den Kompressionsfaktor erhöhen können.

Ein sogenanntes Branch-Filter etwa ersetzt in Maschinencode relative Sprungadressen durch absolute; da oft mehrere Sprungbefehle zur selben Adresse führen, erhöht sich die Redundanz der Eingabedaten, was letztlich zu einem besseren Resultat führt. Zurzeit unterstützt das Branch-Filter ARM-, Itanium-, PowerPC-, SPARC- und x86-Prozessoren.

Bei unkomprimierten Bild- oder Audiodaten könnte sich das Delta-Filter als hilfreich erweisen, das jedes Byte durch die Differenz zu einem vorangegangenen ersetzt. Verglichen mit einem auf Bilder oder Töne spezialisierten verlustlosen Komprimierer dürfte lzma allerdings schlechter abschneiden. Entwickler können der im Quellcode enthaltenen Bibliothek liblzma eigene Filter hinzufügen.

Alle künftigen Versionen von xz sollen das neue Format lesen können. Darüber hinaus versteht das Programm auch das von den LZMA-Utils verwendete Dateiformat. Skripte, die xz über den symbolischen Link lzma aufrufen, erzeugen weiterhin eine Datei im alten Format mit der Namensendung .lzma; das Kommando xz datei hingegen schreibt die Datei datei.xz im neuen Format. Wie gzip weigert sich das Programm, eine Datei mit der Endung .xz ein weiteres Mal zu bearbeiten. Schaden entstünde dadurch aber kaum: Die mehrfach komprimierten Dateien sind nur unwesentlich größer.

iX-Link (mr)