Nach sieben Monaten Entwicklung wurde das Framework 0.2.0 veröffentlicht OpenZL, das für die Erstellung verlustfreier Datenkompressoren gedacht ist.
Das Framework besteht aus einer grundlegenden Bibliothek und Werkzeugen zur Erstellung spezialisierter Kompressoren, die in der Sprache SDDL.
beschrieben sind. Um einen guten spezialisierten Kompressor zu erstellen, gibt es zwei Phasen:
- Datenanalyse zur Extraktion der Struktur.
- Einsatz guter Backend-Kompressoren, die die erhaltene Struktur zur Erreichung einer guten Kompression nutzen.
OpenZL bietet Werkzeuge für beide Phasen.
Das Projekt ist in C und C++ geschrieben und wird unter der BSD-Lizenz verbreitet.
Wesentliche Änderungen
SDDL2
SDDL wurde von Grund auf neu überarbeitet, um die festgelegten Designziele zu erreichen. Während die ursprüngliche Demoversion eine vereinfachte Laufzeitumgebung darstellte, ist SDDL2 ein vollwertiger Compiler: der Parser übergibt die Daten an den semantischen Analysator, dieser wiederum übergibt den typisierten abstrakten Syntaxbaum (AST) an den Optimierer, und der Optimierer steuert den Code-Generator, der den Bytecode für die virtuelle Maschine generiert.
Das entscheidende Ergebnis ist die sofortige Syntaxanalyse. Wenn der Standort eines Eintrags ausschließlich anhand von Parametern und Konstanten bestimmt werden kann, springt die Engine direkt zu jedem Feld, ohne vorhergehende Bytes zu scannen, was einen zugriffsfreien Zugriff und eine Bandbreite von mehreren GB/s ermöglicht.
Die Sprache hat sich zusammen mit dem Werkzeugset weiterentwickelt. Jetzt unterstützt sie 'when'-Blöcke für bedingte Positionierungen, parametrisierte und anonyme Einträge, den Zugriff auf Mitglieder von Eintragsfeldern sowie bitweise und logische Operatoren.
Was die Entwicklerfreundlichkeit betrifft, so erkennt die Phase der semantischen Analyse jetzt unbestimmte Referenzen, Typinkonsistenzen und Arität-Fehler bereits zur Compile-Zeit – einschließlich einer Angabe des Standorts im Quellcode – und es wurde eine VS Code-Erweiterung zur Syntaxhervorhebung für .sddl-Dateien veröffentlicht.
Der neue integrierte LZ-Codec
In OpenZL ist jetzt der eigene LZ-Codec integriert, der in Form von ZL_GRAPH_LZ sowie einem Profil für die sequenzielle Kompression in der zli-Utility dargestellt ist. Die Arbeit an dem Codec wird fortgesetzt: Es erfolgt eine Erweiterung der Funktionalitäten und eine Leistungssteigerung bei der Verarbeitung kleinerer Eingangsdaten. Momentan unterstützt er eine Funktionalität, die dem zstd Level 1 entspricht, mit einer Kompressionsfenstergröße von 64 KB.
OpenZL ermöglicht es, jede Phase des LZ-Pipelines neu zu gestalten, um die Geschwindigkeit zu erhöhen. Seine graphbasierte Architektur erlaubt auch die Kombination von Phasen der Entropiecodierung, anstatt einen einheitlichen Pipeline zu verwenden, der für alle Anwendungsfälle gleich gut geeignet ist. Mehrere Phasen können dann in einem einzigen Vorgang zusammengefasst werden, um die Bearbeitungsgeschwindigkeit zu steigern. Dadurch kann OpenZL eine um 10 % höhere Kompressionsgeschwindigkeit und eine um 70 % höhere Dekompressionsgeschwindigkeit im Vergleich zu Zstandard Level 1 auf dem Silesia-Benchmark in unseren Tests:
| Kompressor | Kompressionsverhältnis | Kompressionsgeschwindigkeit | Dekompressionsgeschwindigkeit |
|---|---|---|---|
| OpenZL LZ Level 1 | 2.74 | 466 MB/s | 2288 MB/s |
| Zstd Level 1 mit 64K Fenstergröße | 2.74 | 419 MB/s | 1254 MB/s |
| Zstd Level 1 | 2.89 | 424 MB/s | 1345 MB/s |
Unterstützung für sehr große Eingangsdaten
zli unterstützt jetzt die Verarbeitung riesiger Eingangsdaten (mehrere Gigabyte groß). Vor der Kompression werden solche Daten jetzt automatisch in steuerbare Fragmente (standardmäßig etwa 16 MB) unterteilt, was hilft, den Speicherbedarf zu begrenzen, die Datenlokalität zu verbessern und die Möglichkeit zur parallelen Verarbeitung zu eröffnen. In SDDL2 wird eine ähnliche Funktion des automatischen Fragmentierens bei der arbeit mit dem Schema realisiert. Im Prozess wurden neue oder aktualisierte Segmentatoren geschaffen – für CSV, Parquet und Standardnumerische Daten – und alle Segmentatoren sind jetzt serialisierbar und anpassbar, sodass die gewählte Anordnung im Kompressor gespeichert und später wiederverwendet werden kann.
Dies wird während der Kompression transparent angewendet. Beachten Sie, dass die Lernpipeline anders ist und unberührt bleibt, sodass sie nicht für die Annahme riesiger Eingangsdaten als Trainingsmaterial gedacht ist.
Verbesserungen im Online-Graph-Visualizer (es auszuprobieren)
Jetzt erkennt der Visualizer die Kompressions- und Dekompressionstraces von Anfang bis Ende.
Das Vorschaufenster ermöglicht es, die tatsächlich über jede Kante fließenden Bytes zu sehen, und dank der Steuerungselemente zum Trimmen bleiben selbst große Streams handhabbar.
Das Einstellungsfenster vereint alle Anzeigeoptionen an einem Ort, wobei die vollständige Tastenkombination – Navigation in Richtungen, geordnete Durchläufe, Entfaltung und Faltung, Knotenauswahl – eine bequeme Nutzung des Werkzeugs ohne Maus ermöglicht.
Jetzt haben die Traces Versionen, die Blockkomprimierung wird korrekt angezeigt, und zli kann endlich eigene Traces mit den neuen Flags —trace und —trace-streams-dir generieren.
Verschiedenes
- Im Katalog wurden mehrere Codecs hinzugefügt. Die Codecs Partition und Bitpack verwenden jetzt einen kombinierten Decoder. Der Codec Floating-point bitsplit erhielt spezielle Encoder und Decoder für die Formate fp16, fp32, fp64 und bf16 mit spezifischen Beschleunigungen. Range-bezogene Splits (split_byrange), ein Längenmultiplexer, der Codec Sentinel, das Graph lz4 und kleine Hilfsfunktionen wie tryParseInt und splitByParam wurden hinzugefügt.
- Die API wurde geordnet.
- Das Fuzzing-Testen wurde verbessert.
- Der Build- und Verpackungsprozess wurde für mehr Plattformen optimiert.
Quelle: linux.org.ru
