Das Unternehmen Meta* hat ein Werkzeug zur Komprimierung und Dekomprimierung von Daten namens OpenZL vorgestellt, das im Vergleich zu den Formaten Zstd und XZ eine höhere Kompressionsrate und Arbeitsgeschwindigkeit aufweist. OpenZL wurde für die effiziente Kompression strukturierter Datensätze entwickelt, die beispielsweise im maschinellen Lernen verwendet werden, sowie für Speicher, die Felder mit verschiedenen wiederkehrenden Informationstypen enthalten. Der Code von OpenZL ist in C/C++ geschrieben und unter der BSD-Lizenz verfügbar.
Bei der Kompression einer Datenbank mit dem astronomischen Katalog der Sterne SAO ermöglichte das OpenZL-Werkzeug eine Reduzierung der Datengröße um den Faktor 2,06, während der zstd-Algorithmus die Informationen um den Faktor 1,31 komprimierte und XZ um den Faktor 1,64. Dabei übertraf OpenZL in der Kompressionsgeschwindigkeit zstd um das Doppelte (203 MB/s gegenüber 115 MB/s) und XZ um das 65-Fache (203 MB/s gegenüber 3,1 MB/s). Die Dekomprimierung mit OpenZL war unwesentlich langsamer als bei zstd (822 MB/s gegenüber 890 MB/s) und 27 Mal schneller als bei XZ.

OpenZL ist kein Algorithmus für allgemeine Zwecke und zeigt nur bei Daten mit zuvor bekannter Struktur gute Ergebnisse. Die Funktionsweise von OpenZL besteht darin, einen adaptiven Kompressor basierend auf der übermittelten Datenbeschreibung zu generieren. Dadurch wird Code zur Kompression erstellt, der für das spezifische Datenformat optimiert ist. Für die Dekompression wird ein universeller Dekompressor verwendet, der mit allen generierten Kompressoren kompatibel ist.
Die Verpackung und Dekompression erfolgt mit einem einzigen Dienstprogramm «zli» oder der Bibliothek libopenzl. Die Datenstruktur wird in Form von Profilen beschrieben. Es gibt bereits eine Reihe vorgegebener Profile, die typische Speicherformate beschreiben. Beispielsweise ein Profil für das CSV-Format oder Daten, die als Array von 64-Bit-Zahlen gespeichert werden. Die Kompression beschränkt sich auf die Auswahl eines Profils mit dem Befehl «zli list-profiles» und den Start des Kompressionsprozesses mit dem Befehl «zli compress —profile profil_name». Für die Dekompression genügt es, «zli decompress» auszuführen.
Für spezifische Formate ist es erforderlich, ein benutzerdefiniertes Profil zu erstellen, indem der Befehl „zli train“ verwendet wird, der Muster in den Daten erkennt und ein Profil mit optimalem Kompressionsgrad erstellt. Mit der Option „—pareto-frontier“ kann das erstellte Profil in Richtung einer Beschleunigung von Verpackung oder Entpackung modernisiert werden, jedoch auf Kosten einer Verringerung des Kompressionsgrads. Zur Beschreibung komplexer Formate mit eingebetteten Strukturen und zur Bestimmung der Anordnung von Datenformaten in Strukturen kann die Sprache SDDL (Simple Data Description Language) verwendet werden.
Die Methode zur Erstellung optimaler Komprimierer basiert auf der Anwendung einer Menge von primitiven Codierern, von denen jeder für bestimmte Datenarten und -folgen am effektivsten ist. Zur Kompression wird ein gerichteter azyklischer Graph zur Datenverarbeitung gebildet, dessen Knoten Codecs sind und dessen Kanten die Datenvarianten im verarbeiteten Format darstellen. Je nach Typ der eingehenden Daten wird eine Kette von Codecs ausgewählt, die das eingehende Datenelement optimal komprimiert. Bei dieser Organisation wird der Header der Datei von einem Codec komprimiert, das Feld mit den Ganzzahl-Daten von einem zweiten, das Feld mit dem steigenden Zähler von einem dritten und das Feld mit den Zeichenfolgen-Daten von einem vierten.

Quelle: opennet.ru
