8.

Zstandard(.zst)完全ガイド — Facebook 製・速度と圧縮率両立・Linux/Debian/PostgreSQL 採用

編集
この記事の要点
  • Zstandard(zstd)は Facebook(現 Meta)の Yann Collet が 2016 年に公開した次世代圧縮アルゴリズム
  • 速度と圧縮率の両立が設計目標。同じ圧縮率なら gzip より数倍速く、同じ速度なら xz に迫る圧縮率
  • Linux カーネル / Debian / Arch Linux / FreeBSD / PostgreSQL / RocksDB など主要 OSS が続々と採用
  • 辞書圧縮に対応 — 似たファイル群から事前学習した辞書で、小さなレコードでも高圧縮可能
  • --long オプションで長距離マッチ、-T0 で全 CPU 使用のマルチスレッド圧縮
  • BSD ライセンスで自由に使え、Apache Parquet / Apache Arrow / OpenZFS にも統合済み

概要

Zstandard(略称 zstd)は 2016 年 8 月、Facebook(現 Meta)のエンジニア Yann Collet が発表した、比較的新しい汎用ロスレス圧縮アルゴリズムおよびファイル形式です。Collet は以前から超高速圧縮 LZ4 の作者として知られており、その経験を活かして「速度と圧縮率の両方をできる限り高い水準で両立させる」ことを目標に設計されました。

従来、汎用圧縮は「速度寄りの gzip」と「圧縮率寄りの xz (LZMA2)」の二択で、用途に応じて妥協する場面が多くありました。zstd は 同じ圧縮率なら gzip より数倍速く、同じ速度なら xz に迫る圧縮率 を実現することで、その妥協を不要にする立ち位置を獲得しました。圧縮レベルは -1 から -19(さらに --ultra-22 まで)と幅広く、用途に合わせて細かく調整できます。

仕様は RFC 8478 として標準化されており、リファレンス実装は BSD ライセンス。Linux カーネル本体(4.14 以降)、Debian の .deb 圧縮(bookworm 以降の選択肢)、Arch Linux のパッケージ標準、FreeBSD、PostgreSQL(WAL/TOAST 圧縮)、RocksDB、Apache Parquet / Arrow、OpenZFS など、現代のインフラ周辺で急速に採用が広がっており、gzip の後継として位置付ける動きが強まっています。

内部構造とマジックナンバー

zstd ファイルの先頭マジックナンバーは 28 B5 2F FD(リトルエンディアンで 0xFD2FB528)です。続いてフレームヘッダ(コンテンツサイズ、ウィンドウサイズ、辞書 ID の有無などのフラグ)、データブロック群、CRC32(オプション)が並びます。

圧縮アルゴリズムは LZ77 ベースの辞書照合 + 有限状態エントロピー(FSE: tANS の一種)+ ハフマン符号 の組み合わせです。ハフマンより理論限界に近い圧縮率を持つ tANS(Asymmetric Numeral Systems)の系統である FSE を採用したことが速度・圧縮率の良バランスに大きく寄与しています。

もうひとつ重要な機能が 辞書圧縮(dictionary compression) です。サイズの小さなレコードを大量に圧縮する場合、各レコード単位では LZ77 の参照範囲が小さく圧縮率が出ません。zstd は事前に「サンプル群から共通パターンを学習した辞書」を作っておき、--train / -D dict.zd で適用することで、JSON ログや小さなネットワークパケットといった用途で gzip の数倍の圧縮率を出せます。

主な用途

  • Linux カーネル / initramfs の圧縮(カーネル 4.14 以降)
  • Linux ディストリビューションのパッケージ圧縮(Arch .pkg.tar.zst、Debian .deb、Fedora の rpm 圧縮)
  • PostgreSQL の WAL 圧縮、Parquet / Arrow の列圧縮、RocksDB / Kafka の内部圧縮
  • 大容量バックアップ(tar --zstd で tar.zst を作成)
  • HTTP 圧縮の選択肢(Content-Encoding: zstd、Chrome/Firefox/Edge が対応済み)
  • ネットワークプロトコルの転送圧縮(小さなメッセージは辞書圧縮を併用)

関連形式との比較

形式圧縮率速度(圧縮)速度(解凍)暗号化備考
zstd -3(既定)中〜高非常に速い非常に速いなしgzip より高速・高圧縮
zstd -19高い遅い非常に速いなし解凍はレベルに依存しない
gzip速い速いなし長年の標準
xz (LZMA2)非常に高い非常に遅いなし圧縮率最優先
lz4低い極めて速い極めて速いなし速度最優先・同作者

コマンド・ツール

# 単一ファイルを zstd 圧縮(デフォルトレベル 3)
zstd huge.csv
# → huge.csv.zst が生成。元ファイルは残る(gzip と違う)

# 圧縮レベルを上げる
zstd -19 huge.csv
zstd --ultra -22 huge.csv      # ultra で -22 まで

# 全 CPU コアを使ってマルチスレッド圧縮
zstd -T0 -19 huge.csv

# 長距離マッチで巨大ファイルの圧縮率を上げる(メモリ使用増)
zstd --long=27 -19 huge.bin

# 展開
zstd -d huge.csv.zst
unzstd huge.csv.zst

# パイプで使う(gzip と同じ感覚)
mysqldump -u root mydb | zstd -T0 -19 > mydb.sql.zst
zstd -dc mydb.sql.zst | mysql -u root mydb

# tar と組み合わせる(tar.zst)
tar --zstd -cvf backup.tar.zst mydir/
tar --zstd -xvf backup.tar.zst
# 古い tar なら:
tar cvf - mydir/ | zstd -T0 -19 > backup.tar.zst

# 辞書を学習してから圧縮(小レコード大量パターン)
zstd --train samples/*.json -o app.dict
zstd -D app.dict event-001.json -o event-001.json.zst

注意点・落とし穴

  • 古い環境では解凍ツールが入っていない — CentOS 7 などレガシー OS では zstd コマンドが標準で入っていない。バックアップを古いサーバに戻す可能性があるなら、復元側にも zstd を確保しておく。
  • 圧縮レベルの差が小さい範囲がある — レベル 3〜10 は性能カーブが緩やか、10 を超えると圧縮率は上がるが急速に時間が伸びる。バックアップは -19、ログのリアルタイム圧縮は -3-6、HTTP 動的圧縮は -1-3 が目安。
  • 解凍速度は圧縮レベルにほぼ依存しない-19 で固めても -3 と同じ高速で解凍できる。「読まれる回数が多いファイルほど高圧縮レベルで作っておく」のが定石。
  • --long=27 のメモリ要件 — 長距離マッチを有効にすると圧縮側・解凍側ともに 128MB(27 なら 128MB、28 なら 256MB...)のメモリが必要。共有環境では事前に合意しておく。
  • 暗号化機能はない — gzip 同様、保護が必要なら GPG や AES の追加レイヤを併用する。
  • 辞書配布の運用負荷 — 辞書圧縮は強力だが、圧縮側と展開側で同じ辞書ファイルを共有する必要がある。辞書のバージョン管理を仕組みとして整える必要がある。

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. ZIP(.zip)
  2. TAR(.tar)
  3. GZ / GZIP(.gz / .tgz)
  4. 7z(.7z)
  5. RAR(.rar)
  6. BZ2 / BZIP2(.bz2 / .tbz2)
  7. XZ / LZMA2(.xz / .txz)
  8. Zstandard(.zst / .zstd)
  9. CAB(.cab)
  10. LZH(.lzh / .lha)

最近更新/作成されたページ