Kleine Differenzen
Zwar werden Festplatten immer größer und Netze immer schneller. Doch das zu bewältigende Datenvolumen wächst ebenfalls. Sogenannte Deltas können den Datenberg erheblich verringern.
- Michael Riepe
Wer Änderungen an Textdateien übertragen oder speichern will, verwendet in der Regel diff zum Herausarbeiten der Unterschiede. Die kann der Empfänger mit patch in seine Kopie übertragen. Da der gesendete „Flicken“ (Patch) gewöhnlich viel kürzer ist als die zu flickende Datei, spart man Übertragungszeit.
Leider funktioniert diff nur mit einfachen Textdateien, etwa Quelltext oder HTML. Bei Word-Dateien, PDFs oder Tar-Archiven stößt das Programm an seine Grenzen. Binäre Deltas – nach dem griechischen Buchstaben Δ, der in der Mathematik für die Differenz zweier Werte steht – bieten sich als Alternative an.
Erzeugen lassen sie sich zum Beispiel mit xdelta delta <alte_datei> <neue_datei> <delta>. Der Empfänger kann mit xdelta patch <delta> <alte_datei> <neue_datei> aus dem Delta und seiner Kopie der alten Version die neue generieren. xdelta info <delta> zeigt die im Delta gespeicherten Zusatzinformationen an – Name, Länge und MD5-Prüfsumme der Quell- und Zieldateien sowie eine Statistik der übernommenen und hinzugefügten Daten. Letztere komprimiert das Programm, damit sie weniger Platz benötigen. Die Kompressionsstärke lässt sich wie bei gzip mit den Optionen –1 bis –9 einstellen; –0 schaltet den Kompressor ab.
Ein-, aus- und umgepackt
Aus komprimierten Dateien lassen sich nur selten kompakte Deltas erzeugen. Deshalb entpackt xdelta mit compress oder gzip komprimierte Dateien, bevor es das Delta erzeugt. Mit der Option –p lässt sich der zusätzliche Schritt unterbinden.
Das Programm rdiff arbeitet ähnlich wie xdelta, kommt jedoch ohne die alte Version der Datei aus. Stattdessen verwendet es einen Fingerabdruck (Signatur), der nur einen Bruchteil des Platzes benötigt – in der Standardeinstellung gut ein halbes Prozent. Hat der Nutzer mit rdiff signature <alte_datei> <signatur> den Fingerabdruck erstellt, kann er mit rdiff delta <signatur> <neue_datei> <delta> das Delta erzeugen. Allerdings kann rdiff nicht mit komprimierten Dateien umgehen und erzeugt erheblich größere Deltas als xdelta.
Beide Programme verwenden ihr eigenes Dateiformat – xdelta aus historischen Gründen. Erst 2001 entstand ein Vorschlag für ein standardisiertes Format namens VCDIFF, den die IETF 2002 als RFC 3284 veröffentlicht hat.
Eine noch recht junge Implementierung des Standards bietet das Google-Projekt open-vcdiff. Neben Bibliotheken zum Entwickeln eigener Software ist im Paket das Programm vcdiff zum Erzeugen und Anwenden von Deltas enthalten. Es weist jedoch im Gegensatz zu xdelta eine erhebliche Einschränkung auf: Die Bezugsdatei, bei vcdiff „Dictionary“ genannt, muss in den Hauptspeicher passen. Vermutlich haben die Entwickler ein anderes Ziel im Auge, nämlich die Umsetzung des SDCH-Protokolls (Shared Dictionary Compression over HTTP), eines weiteren Google-Projekts, das bei der Übertragung von Webseiten Zeit sparen soll.
Eier legende Wollmilchsau
Das VCDIFF-Format verwendet auch xdelta3, der Nachfolger von xdelta. Allerdings muss sich der Nutzer an eine neue Aufrufsyntax gewöhnen: Die Befehle zum Erzeugen und Anwenden eines Deltas lauten jetzt xdelta3 encode und xdelta3 decode. Es lassen sich jedoch auch die Optionen –e und –d verwenden. Den Namen der Ausgangsdatei übergibt man mit –s <alte_datei>. Der Befehl xdelta3 –e –s <alte_datei> liest die neue Version von der Standardeingabe und schreibt das Delta auf die Standardausgabe; man kann die Namen der Ein- und Ausgabedateien jedoch auch als Argumente übergeben. Komprimierte Dateien entpackt das Programm, bevor es das Delta erzeugt.
Ein Vorteil der neuen Syntax ist, dass sie xdelta3 „aufrufkompatibel“ zu gängigen Kompressionsprogrammen wie gzip macht. Das erlaubt es zum Beispiel, das Programm mit tar - -use-compress-program=xdelta3 aus GNU tar heraus zu verwenden. Weitere Optionen kann man in der Environment-Variablen XDELTA nachreichen, etwa mit export XDELTA="–s <alte_datei>".
Lässt man die Option –s weg, erzeugt das Programm ein Delta der Eingabedatei „zu sich selbst“: Es ersetzt sich wiederholende Byte-Folgen durch Verweise auf das Original, wie ein gewöhnliches Kompressionsprogramm. Der Raumgewinn ist nicht ganz so hoch wie bei gzip oder gar bzip2, jedoch deutlich höher als der von compress.
Unter Umständen – etwa bei Archiven, die Textdateien enthalten – lohnt es sich, mit –S djw die sogenannte sekundäre Kompression einzuschalten. Sie verwendet einen Huffman-Code, der die Redundanz der im Delta enthaltenen Daten verringert. Mit xdelta3 recode –S djw <delta1> <delta2> lässt sich das auch nachträglich erledigen.
Das Kommando xdelta3 merge –m <delta1> <delta2> <delta1+2> fügt mehrere Deltas zu einem zusammen. Das erspart es dem Empfänger, sie nacheinander auf die Ausgangsdatei anzuwenden. Fehlt nur noch die Möglichkeit, ein „umgekehrtes“ (reverse) Delta zu erzeugen, das die neue Dateiversion wieder in die alte verwandelt – im Gegensatz zu Diffs bieten Deltas diese Möglichkeit nämlich nicht.