- 早 12 月、今年は Advent Calendar に参加することができ嬉しく思います。
- 今回の参加テーマは CLI。中年は CLI が大好きな生き物です(偏見)
Prologue
-
はえ〜、Meta って圧縮ツール作っとったんや
- ん?ベンチに使われてる
zstdって知らんなあ-
$ zstd hello.txt $ ls hello.txt.* hello.txt.zst- いや使えるんかい!!
-
- ん?ベンチに使われてる
日頃の圧縮行動
- 話は変わりますが、日常で圧縮/解凍を行うのはこんなシーンではないでしょうか。
稼働サービスの蓄積データやログの圧縮に
-
logrotateでも行われる一般的な使途ですが、
横着して以下のようなことはよくやります。$ SVC=my_service.py DATE=$(date +%Y-%m-%d) LOG=_log/${DATE}_${SVC%.*}.txt $ nohup python3 my_service.py > $LOG 2>&1 &$ gzip _log/*.txt- データやログが巨大なサービスでは、これだけで
ストレージの領域が大きく空くので、意外と重要です。
- データやログが巨大なサービスでは、これだけで
簡易的なバージョン管理に
-
gitは大好きですが、「まだgitを使う時ではないな」という時に$ gzip -k hello.txt (hello.txt を編集中...) $ FILE=hello.txt; zdiff -NEwur ${FILE}.gz $FILE (変更差分が表示される)-
gzは古いファイル、xzは新しい(変更検討中の)ファイル
というマイルールを設けて利用しています。 - 特に、
/etc/の中のファイルを変更する際によくやります。
-
zstd の性能比較
- 話は
zstdに戻りますが、既に様々な Linux 環境に浸透していました。
: プリインストールされている
: プリインストールはされていないが apt installすれば使える-
Ubuntu -
Debian -
Raspberry Pi OS -
Termux (Android) -
Armbian -
DietPi
-
-
zstdは(冒頭の記事にもある通り)、以下の特徴があります。-
gzipよりも圧縮率が高く -
gzipよりも高速に処理できる
-
- 宣伝に偽り無いかどうか、簡単ではありますが私の手元でも確認してみました。
- 検証環境 : Ubuntu 24.04
- 検証対象 : ASCII text
-
/var/log/にあったsyslogやauth.logを適当に集めて利用しました。
-
圧縮率比較
-
xzは、さすがの圧縮率です。type size pct. plain 19 MB 100 % gzip 3.0 MB 15.8 % gstd 2.7 MB 14.2 % xz 1.6 MB 8.4 %
処理速度比較
-
圧縮
type value gzip 0.714 s gstd 0.205 s xz 9.250 s -
xzは並列化オプションは使っていません。
-
-
解凍
type value gzip 0.193 s gstd 0.095 s xz 0.252 s - いずれも優秀ですが、量や実行回数が多い場合には考慮する必要がありそうです。
付記
- つい先日、東京にて開催されていた Open Source Summit Japan 2025 でも
zstdと OpenZL に関するセッションがあったようです。-
Beyond Zstandard: The Future of Data Compression - Yann Collet, Meta
- スライドも PDF にて公開されており、性能比較データも掲載されています。
-
Beyond Zstandard: The Future of Data Compression - Yann Collet, Meta
zstd の使い方
- 前章から、「
zstdは使うべき」ということで話を進めたいと思います。
zstd は基本的には gzip や xz と同じように使える
- 基本的な使い方は同じです。拡張子は
.zstです。-
hello.txtを圧縮する$ zstd hello.txt -
hello.txt.zstを解凍する$ unzstd hello.txt.zst
-
完全な互換動作ではない
-
option 指定なしの場合、
zstdは「元のファイルを残す」が既定の動作になります。$ zstd hello.txt $ ls -1 hello.txt* hello.txt hello.txt.zst-
gzipとxzは「元のファイルを残さない」が既定なので、
単純にgzipやxzをzstdコマンドに差し替えるだけでは
ストレージ容量も削減されません。
-
-
このようになった経緯は GitHub の issue に記載されていました
- 「辞書圧縮」という仕様を考慮してのことだそうです(詳しくはよく知りません)。
敢えて互換動作させたい場合
-
前項の issue の末尾のコメントにも記載がありますが、「
aliasを使え」とのこと
なので、(bashをご利用の場合は)~/.bashrcの alias 定義集の下に
以下を追記しておけば、既定の動作が「元ファイル削除」になります。alias zstd='zstd --rm' alias unzstd='unzstd --rm'- issue のコメントにも「既定仕様の
-kとぶつかるが、後勝ち (last one wins)」
とあるので、一応これで問題無いのだろうと思います。
- issue のコメントにも「既定仕様の
Epilogue
-
さて、これで心置きなく
zstdを使えるぞ!と思いきや、$ FILE=hello.txt; zdiff -NEwur ${FILE}.gz $FILE (変更差分が表示される)- 残念ながら、
zstdにはgzipのこのzdiffに相当する
zstddiffのようなコマンドは用意されていません。- これについては、長くなったのでまた次の機会に書きたいと思います。
- 残念ながら、