Warum ist eine mit Python erstellte tar.xz-Datei kleiner als eine mit dem Standard-tar erstellte Datei?
(superuser.com)-
Eine mit macOS
tarerstellte Datei ist 15-mal größer als eine mit der Python-tarfile-Funktion erstellte Datei -
Ursache: BSD/GNU
tarlegt Dateien im Archiv ohne feste Reihenfolge ab, wodurch sich je nach Dateityp die Kompressionsrate verschlechtern kann
→ Die Python-tarfile-Funktion sortiert standardmäßig
- Bei GNU
tarkann man mit der Option--sortnachname/inodesortieren → mit Sortierung dieselbe Kompressionsrate
4 Kommentare
Ich verstehe es nicht ganz: Warum ändert sich die Kompressionsrate, wenn man Sortierung anwendet? Die Kompressionsrate pro einzelner Datei wäre doch gleich.
Der verwendete Algorithmus ist Deflate. Dabei werden zuvor zur Komprimierung genutzte Inhalte in einem Sliding Window gespeichert. Wenn diesmal 10 Byte verarbeitet wurden, werden diese 10 Byte am Ende des Sliding Window angehängt; die Größe des Sliding Window ist dabei fest.
Wenn ein Inhalt gefunden wird, der mit einem Inhalt im Sliding Window übereinstimmt, wird zur Komprimierung stattdessen LLD (Literal, Length, Distance) geschrieben. Distance gibt an, ab welcher Stelle im Sliding Window der gleiche Inhalt beginnt, Length die Länge des gleichen Inhalts im Sliding Window, und Literal ist das erste nicht übereinstimmende Zeichen.
Da es bei Deflate wichtig ist, was im Sliding Window enthalten ist, ist entscheidend, ob ein ähnlicher Inhalt unmittelbar zuvor gesehen wurde. Wenn also zuvor eine ähnliche Datei verarbeitet wurde, ist die Wahrscheinlichkeit höher, dass sie besser komprimiert werden kann.
Wie auf diese Weise komprimiert wird, zeigt der folgende Foliensatz. (
gzipbasiert ebenfalls auf Deflate.)https://speakerdeck.com/dalinaum/…
Da Dateien mit demselben oder einem ähnlichen Namen im selben Ordner inhaltlich oft ähnlich sind, ist auch die Kompressionsrate wahrscheinlich höher.
Gemeint ist wohl, dass der Bereich, in dem beim Komprimieren nach solchen Gemeinsamkeiten gesucht wird, nicht unbegrenzt groß ist. Wenn man die Dateien also sortiert, landen ähnliche Dateien näher beieinander, sodass sie mit höherer Wahrscheinlichkeit effizienter komprimiert werden.