Zstandard , oder kurz zstd
, ist ein schneller verlustfreier Komprimierungsalgorithmus, der auf Echtzeit-Komprimierungsszenarien auf Zlib-Ebene und bessere Komprimierungsraten abzielt. Es wird durch eine sehr schnelle Entropiestufe unterstützt, die von Huff0 und der FSE-Bibliothek bereitgestellt wird.
Das Format von Zstandard ist stabil und in RFC8878 dokumentiert. Es sind bereits mehrere unabhängige Implementierungen verfügbar. Dieses Repository stellt die Referenzimplementierung dar, die als Open-Source-Dual-BSD- ODER GPLv2-lizenzierte C- Bibliothek und als Befehlszeilenprogramm zur Erstellung und Dekodierung .zst
, .gz
, .xz
und .lz4
Dateien bereitgestellt wird. Sollte Ihr Projekt eine andere Programmiersprache erfordern, finden Sie auf der Zstandard-Homepage eine Liste bekannter Ports und Bindungen.
Status des Entwicklungszweigs:
Als Referenz wurden mehrere schnelle Komprimierungsalgorithmen auf einem Desktop mit einer Core i7-9700K-CPU bei 4,9 GHz und unter Ubuntu 20.04 ( Linux ubu20 5.15.0-101-generic
) mithilfe von lzbench, einem Open-Source-In-Memory, getestet und verglichen Benchmark von @inikep, kompiliert mit gcc 9.4.0, auf dem Silesia-Komprimierungskorpus.
Kompressorname | Verhältnis | Kompression | Dekomprimieren. |
---|---|---|---|
zstd 1.5.6 -1 | 2.887 | 510 MB/s | 1580 MB/s |
zlib 1.2.11 -1 | 2.743 | 95 MB/s | 400 MB/s |
Brotli 1.0.9 -0 | 2.702 | 395 MB/s | 430 MB/s |
zstd 1.5.6 --fast=1 | 2.437 | 545 MB/s | 1890 MB/s |
zstd 1.5.6 --fast=3 | 2.239 | 650 MB/s | 2000 MB/s |
Quicklz 1.5.0 -1 | 2.238 | 525 MB/s | 750 MB/s |
lzo1x 2.10 -1 | 2.106 | 650 MB/s | 825 MB/s |
lz4 1.9.4 | 2.101 | 700 MB/s | 4000 MB/s |
lzf 3,6 -1 | 2.077 | 420 MB/s | 830 MB/s |
bissig 1.1.9 | 2.073 | 530 MB/s | 1660 MB/s |
Die mit --fast=#
angegebenen negativen Komprimierungsstufen bieten eine schnellere Komprimierungs- und Dekomprimierungsgeschwindigkeit auf Kosten der Komprimierungsrate.
Zstd kann auf Kosten der Komprimierungsgeschwindigkeit auch stärkere Komprimierungsverhältnisse bieten. Der Kompromiss zwischen Geschwindigkeit und Komprimierung kann in kleinen Schritten konfiguriert werden. Die Dekomprimierungsgeschwindigkeit bleibt erhalten und bleibt bei allen Einstellungen ungefähr gleich, eine Eigenschaft, die die meisten LZ-Komprimierungsalgorithmen wie zlib oder lzma gemeinsam haben.
Die folgenden Tests wurden auf einem Server mit Linux Debian ( Linux version 4.14.0-3-amd64
) mit einer Core i7-6700K-CPU bei 4,0 GHz unter Verwendung von lzbench, einem Open-Source-In-Memory-Benchmark von @inikep, kompiliert mit gcc, durchgeführt 7.3.0, zum Silesia-Kompressionskorpus.
Komprimierungsgeschwindigkeit vs. Verhältnis | Dekompressionsgeschwindigkeit |
---|---|
Einige andere Algorithmen können höhere Komprimierungsraten bei langsameren Geschwindigkeiten erzeugen und somit außerhalb des Diagramms liegen. Für ein größeres Bild einschließlich langsamer Modi klicken Sie auf diesen Link.
Frühere Diagramme liefern Ergebnisse, die auf typische Datei- und Stream-Szenarien (mehrere MB) anwendbar sind. Small Data bringt unterschiedliche Perspektiven mit sich.
Je kleiner die zu komprimierende Datenmenge ist, desto schwieriger ist die Komprimierung. Dieses Problem tritt bei allen Komprimierungsalgorithmen auf. Der Grund dafür ist, dass Komprimierungsalgorithmen aus vergangenen Daten lernen, wie zukünftige Daten komprimiert werden. Aber am Anfang eines neuen Datensatzes gibt es keine „Vergangenheit“, auf der man aufbauen kann.
Um diese Situation zu lösen, bietet Zstd einen Trainingsmodus an, mit dem der Algorithmus für einen ausgewählten Datentyp optimiert werden kann. Das Training von Zstandard wird durch die Bereitstellung einiger Beispiele (eine Datei pro Beispiel) erreicht. Das Ergebnis dieses Trainings wird in einer Datei namens „Dictionary“ gespeichert, die vor der Komprimierung und Dekomprimierung geladen werden muss. Mit diesem Wörterbuch verbessert sich das erreichbare Komprimierungsverhältnis bei kleinen Datenmengen erheblich.
Im folgenden Beispiel wird der Beispielsatz github-users
verwendet, der aus der öffentlichen Github-API erstellt wurde. Es besteht aus etwa 10.000 Datensätzen mit einem Gewicht von jeweils etwa 1 KB.
Kompressionsverhältnis | Komprimierungsgeschwindigkeit | Dekompressionsgeschwindigkeit |
---|---|---|
Diese Komprimierungsgewinne werden bei gleichzeitig schnellerer Komprimierungs- und Dekomprimierungsgeschwindigkeit erreicht.
Das Training funktioniert, wenn in einer Familie kleiner Datenstichproben eine gewisse Korrelation besteht. Je datenspezifischer ein Wörterbuch ist, desto effizienter ist es (es gibt kein universelles Wörterbuch ). Daher bietet die Bereitstellung eines Wörterbuchs pro Datentyp die größten Vorteile. Wörterbuchgewinne sind vor allem in den ersten paar KB wirksam. Anschließend verwendet der Komprimierungsalgorithmus nach und nach zuvor dekodierte Inhalte, um den Rest der Datei besser zu komprimieren.
Erstellen Sie das Wörterbuch
zstd --train FullPathToTrainingSet/* -o dictionaryName
Mit Wörterbuch komprimieren
zstd -D dictionaryName FILE
Mit Wörterbuch entpacken
zstd -D dictionaryName --decompress FILE.zst
make
ist das offiziell gepflegte Build-System dieses Projekts. Alle anderen Build-Systeme sind „kompatibel“ und werden von Drittanbietern gewartet. Sie können geringfügige Unterschiede bei den erweiterten Optionen aufweisen. Wenn Ihr System dies zulässt, verwenden Sie zum Erstellen von zstd
und libzstd
lieber make
.
Wenn Ihr System mit dem Standard- make
(oder gmake
) kompatibel ist, wird durch den Aufruf make
im Stammverzeichnis zstd
CLI im Stammverzeichnis generiert. Außerdem wird libzstd
in lib/
erstellt.
Weitere verfügbare Optionen sind:
make install
: ZSTD-CLI, Bibliothek und Manpages erstellen und installierenmake check
: Erstellen und Ausführen zstd
, Testen seines Verhaltens auf der lokalen Plattform Das Makefile
folgt den GNU-Standard-Makefile-Konventionen und ermöglicht eine gestaffelte Installation, Standard-Flags, Verzeichnisvariablen und Befehlsvariablen.
Für fortgeschrittene Anwendungsfälle sind spezielle Kompilierungsflags, die die Binärgenerierung steuern, in lib/README.md
für die libzstd
-Bibliothek und in programs/README.md
für die zstd
CLI dokumentiert.
Ein cmake
-Projektgenerator wird in build/cmake
bereitgestellt. Es kann Makefiles oder andere Build-Skripte generieren, um zstd
Binärbibliotheken sowie dynamische und statische libzstd
Bibliotheken zu erstellen.
Standardmäßig ist CMAKE_BUILD_TYPE
auf Release
eingestellt.
zstd
kann mit Unterstützung sowohl für Apple Silicon (M1/M2) als auch für Intel mithilfe der Universal2-Unterstützung von CMake erstellt und installiert werden. Um einen Fat/Universal2-Build und eine Installation durchzuführen, verwenden Sie die folgenden Befehle:
cmake -B build-cmake-debug -S build/cmake -G Ninja -DCMAKE_OSX_ARCHITECTURES= " x86_64;x86_64h;arm64 "
cd build-cmake-debug
ninja
sudo ninja install
Ein Meson-Projekt wird in build/meson
bereitgestellt. Befolgen Sie die Buildanweisungen in diesem Verzeichnis.
Sie können sich auch die Datei .travis.yml
ansehen, um ein Beispiel dafür zu sehen, wie Meson zum Erstellen dieses Projekts verwendet wird.
Beachten Sie, dass der Standard-Build-Typ „Release“ ist.
Sie können den Abhängigkeitsmanager zstd vcpkg erstellen und installieren:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install zstd
Der zstd-Port in vcpkg wird von Microsoft-Teammitgliedern und Community-Mitwirkenden auf dem neuesten Stand gehalten. Wenn die Version veraltet ist, erstellen Sie bitte einen Issue oder Pull Request im vcpkg-Repository.
Sie können vorgefertigte Binärdateien für zstd installieren oder es mit Conan aus dem Quellcode erstellen. Verwenden Sie den folgenden Befehl:
conan install --requires= " zstd/[*] " --build=missing
Das zstd-Conan-Rezept wird von Conan-Betreuern und Community-Mitwirkenden auf dem neuesten Stand gehalten. Wenn die Version veraltet ist, erstellen Sie bitte einen Issue oder Pull Request im ConanCenterIndex-Repository.
Wenn Sie in build
-Verzeichnis gehen, finden Sie zusätzliche Möglichkeiten:
build/VS_scripts
, die zstd
CLI- und libzstd
-Bibliothek erstellen, ohne dass die Visual Studio-Lösung geöffnet werden muss. Sie können die zstd-Binärdatei über Buck erstellen, indem Sie „ buck build programs:zstd
im Stammverzeichnis des Repos ausführen. Die ausgegebene Binärdatei befindet sich in buck-out/gen/programs/
.
Sie können zstd problemlos in Ihr Bazel-Projekt integrieren, indem Sie das im Bazel Central Repository gehostete Modul verwenden.
Sie können schnelle lokale Rauchtests durchführen, indem Sie make check
ausführen. Wenn Sie make
nicht verwenden können, führen Sie das Skript playTest.sh
aus dem Verzeichnis src/tests
aus. Für das Testskript werden zwei Umgebungsvariablen $ZSTD_BIN
und $DATAGEN_BIN
benötigt, um die zstd
und datagen
Binärdatei zu finden. Informationen zu CI-Tests finden Sie unter TESTING.md
.
Zstandard wird derzeit in Facebook und vielen anderen großen Cloud-Infrastrukturen eingesetzt. Es wird kontinuierlich ausgeführt, um große Datenmengen in verschiedenen Formaten und Anwendungsfällen zu komprimieren. Zstandard gilt als sicher für Produktionsumgebungen.
Zstandard ist unter BSD ODER GPLv2 doppelt lizenziert.
Der dev
ist derjenige, in dem alle Beiträge zusammengeführt werden, bevor sie release
werden. Wenn Sie vorhaben, einen Patch vorzuschlagen, verpflichten Sie sich bitte zum dev
oder seinem eigenen Feature-Zweig. Ein direkter Commit zur release
ist nicht zulässig. Weitere Informationen finden Sie unter BEITRAG.