Zstandard (短縮版としてzstd
は、高速可逆圧縮アルゴリズムであり、zlib レベルでのリアルタイム圧縮シナリオとより優れた圧縮率をターゲットとしています。これは、Huff0 および FSE ライブラリによって提供される、非常に高速なエントロピー ステージによって支えられています。
Zstandard の形式は安定しており、RFC8878 で文書化されています。複数の独立した実装がすでに利用可能です。このリポジトリは、オープンソースのデュアル BSD または GPLv2 ライセンスのCライブラリとして提供されるリファレンス実装と、 .zst
、 .gz
、 .xz
、および.lz4
ファイルを生成およびデコードするコマンド ライン ユーティリティとして提供されます。プロジェクトで別のプログラミング言語が必要な場合は、既知のポートとバインディングのリストが Zstandard ホームページで提供されます。
開発ブランチのステータス:
参考として、オープンソースのインメモリである lzbench を使用して、Core i7-9700K CPU @ 4.9GHz を搭載し、Ubuntu 20.04 ( Linux ubu20 5.15.0-101-generic
) を実行しているデスクトップで、いくつかの高速圧縮アルゴリズムをテストして比較しました。 @inikep による、Silesia 圧縮コーパス上の gcc 9.4.0 でコンパイルされたベンチマーク。
コンプレッサー名 | 比率 | 圧縮 | 解凍します。 |
---|---|---|---|
zstd 1.5.6 -1 | 2.887 | 510MB/秒 | 1580MB/秒 |
zlib 1.2.11 -1 | 2.743 | 95MB/秒 | 400MB/秒 |
ブロトリ 1.0.9 -0 | 2.702 | 395MB/秒 | 430MB/秒 |
zstd 1.5.6 --fast=1 | 2.437 | 545MB/秒 | 1890MB/秒 |
zstd 1.5.6 --fast=3 | 2.239 | 650MB/秒 | 2000MB/秒 |
クイックルズ 1.5.0 -1 | 2.238 | 525MB/秒 | 750MB/秒 |
lzo1x 2.10 -1 | 2.106 | 650MB/秒 | 825MB/秒 |
lz4 1.9.4 | 2.101 | 700MB/秒 | 4000MB/秒 |
lzf 3.6 -1 | 2.077 | 420MB/秒 | 830MB/秒 |
スナッピー 1.1.9 | 2.073 | 530MB/秒 | 1660MB/秒 |
--fast=#
で指定された負の圧縮レベルでは、圧縮率は犠牲になりますが、圧縮速度と解凍速度が向上します。
Zstd は、圧縮速度を犠牲にして、より強力な圧縮率を提供することもできます。速度と圧縮のトレードオフは、少しずつ設定できます。解凍速度は維持され、どの設定でもほぼ同じままです。これは、zlib や lzma などのほとんどの LZ 圧縮アルゴリズムに共通の特性です。
次のテストは、Core i7-6700K CPU @ 4.0GHz を搭載した Linux Debian ( Linux version 4.14.0-3-amd64
) を実行しているサーバーで、gcc でコンパイルされた @inikep によるオープンソースのインメモリ ベンチマークである lzbench を使用して実行されました。 7.3.0、シレジア圧縮コーパス上。
圧縮速度と比率 | 減圧速度 |
---|---|
他のいくつかのアルゴリズムは、低速でも高い圧縮率を生成できますが、グラフの範囲外になります。低速モードを含む大きな画像を表示するには、このリンクをクリックしてください。
前のグラフは、一般的なファイルおよびストリームのシナリオ (数 MB) に適用できる結果を示しています。小さなデータにはさまざまな視点があります。
圧縮するデータの量が少ないほど、圧縮は難しくなります。この問題はすべての圧縮アルゴリズムに共通であり、その理由は、圧縮アルゴリズムが将来のデータを圧縮する方法を過去のデータから学習するためです。しかし、新しいデータセットの開始時には、構築できる「過去」はありません。
この状況を解決するために、Zstd は、選択した種類のデータに合わせてアルゴリズムを調整するために使用できるトレーニング モードを提供します。 Zstandard のトレーニングは、いくつかのサンプル (サンプルごとに 1 つのファイル) を提供することで実現されます。このトレーニングの結果は、「辞書」と呼ばれるファイルに保存されます。このファイルは、圧縮および解凍の前にロードする必要があります。この辞書を使用すると、小さなデータで達成できる圧縮率が大幅に向上します。
次の例では、github パブリック API から作成されたgithub-users
サンプル セットを使用します。これは、それぞれ約 1KB の約 10,000 個のレコードで構成されています。
圧縮率 | 圧縮速度 | 減圧速度 |
---|---|---|
これらの圧縮効果は、より高速な圧縮速度と解凍速度を同時に実現しながら達成されます。
トレーニングは、一連の小さなデータ サンプルに相関関係がある場合に機能します。辞書がデータに特化すればするほど、効率が高くなります (汎用辞書は存在しません)。したがって、データの種類ごとに 1 つの辞書を展開すると、最大の利点が得られます。辞書の向上は、主に最初の数 KB で効果を発揮します。その後、圧縮アルゴリズムは、以前にデコードされたコンテンツを徐々に使用して、ファイルの残りの部分をより適切に圧縮します。
辞書を作成する
zstd --train FullPathToTrainingSet/* -o dictionaryName
辞書を使って圧縮する
zstd -D dictionaryName FILE
辞書を使って解凍する
zstd -D dictionaryName --decompress FILE.zst
make
このプロジェクトの公式に保守されているビルド システムです。他のすべてのビルド システムは「互換性」があり、サードパーティによって保守されており、高度なオプションに小さな違いがある場合があります。システムで許可されている場合は、 make
使用してzstd
およびlibzstd
ビルドすることをお勧めします。
システムが標準のmake
(またはgmake
) と互換性がある場合、ルート ディレクトリでmake
を呼び出すと、ルート ディレクトリにzstd
cli が生成されます。また、 libzstd
lib/
に作成します。
その他の利用可能なオプションは次のとおりです。
make install
: zstd cli、ライブラリ、man ページを作成してインストールします。make check
: zstd
を作成して実行し、ローカル プラットフォームでの動作をテストします。 Makefile
GNU 標準 Makefile 規則に従っており、段階的インストール、標準フラグ、ディレクトリ変数、コマンド変数が可能です。
高度な使用例については、バイナリ生成を制御する特殊なコンパイル フラグが、 libzstd
ライブラリの場合はlib/README.md
に、 zstd
CLI の場合はprograms/README.md
に文書化されています。
cmake
プロジェクト ジェネレーターはbuild/cmake
内で提供されます。 Makefile またはその他のビルド スクリプトを生成して、 zstd
バイナリ、 libzstd
動的ライブラリおよび静的ライブラリを作成できます。
デフォルトでは、 CMAKE_BUILD_TYPE
はRelease
に設定されています。
zstd
CMake の Universal2 サポートを使用して、Apple Silicon (M1/M2) と Intel の両方をサポートしてビルドおよびインストールできます。 Fat/Universal2 のビルドとインストールを実行するには、次のコマンドを使用します。
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
Meson プロジェクトはbuild/meson
内で提供されます。そのディレクトリ内のビルド手順に従ってください。
Meson を使用してこのプロジェクトを構築する方法の例については、 .travis.yml
ファイルを参照してください。
デフォルトのビルドタイプはrelease であることに注意してください。
zstd vcpkg 依存関係マネージャーをビルドしてインストールできます。
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install zstd
vcpkg の zstd ポートは、Microsoft チームのメンバーとコミュニティの貢献者によって最新の状態に維持されます。バージョンが古い場合は、vcpkg リポジトリで問題を作成するか、プル リクエストを作成してください。
zstd 用のビルド済みバイナリをインストールすることも、Conan を使用してソースからビルドすることもできます。次のコマンドを使用します。
conan install --requires= " zstd/[*] " --build=missing
zstd コナン レシピは、コナン メンテナーとコミュニティの貢献者によって最新の状態に保たれています。バージョンが古い場合は、ConanCenterIndex リポジトリで問題を作成するか、プル リクエストを作成してください。
build
ディレクトリに移動すると、追加の可能性が見つかります。
build/VS_scripts
内)。Visual Studio ソリューションを開く必要がなく、 zstd
cli とlibzstd
ライブラリをビルドします。リポジトリのルートからbuck build programs:zstd
実行することで、buck 経由で zstd バイナリをビルドできます。出力バイナリはbuck-out/gen/programs/
にあります。
Bazel Central Repository でホストされているモジュールを使用すると、zstd を Bazel プロジェクトに簡単に統合できます。
make check
実行すると、簡単なローカル スモーク テストを実行できます。 make
使用できない場合は、 src/tests
ディレクトリからplayTest.sh
スクリプトを実行します。テスト スクリプトがzstd
バイナリとdatagen
バイナリを見つけるには、2 つの環境変数$ZSTD_BIN
と$DATAGEN_BIN
が必要です。 CI テストの詳細については、 TESTING.md
を参照してください。
Zstandard は現在、Facebook や他の多くの大規模なクラウド インフラストラクチャ内に導入されています。複数の形式やユースケースで大量のデータを圧縮するために継続的に実行されます。 Zstandard は実稼働環境にとって安全であると考えられています。
Zstandard は、BSD または GPLv2 に基づいてデュアルライセンスされています。
dev
ブランチは、 release
到達する前にすべての貢献がマージされるブランチです。パッチを提案する予定がある場合は、 dev
ブランチ、または独自の feature ブランチにコミットしてください。 release
への直接コミットは許可されません。詳細については、「貢献」をお読みください。