gzip / bzip2 / xz / zstd 比較入門 - 圧縮形式の選び方

gzip / bzip2 / xz / zstd 比較入門 - 圧縮形式の選び方

4 つの圧縮形式、どれを選べばいい?

結論: 迷ったら zstd。速度・圧縮率・並列対応のバランスが最良。配布互換性なら gzip、極限の圧縮率なら xz、bzip2 は新規採用の理由がほぼない。

Linux でファイルを圧縮するとき、gzip / bzip2 / xz / zstd の 4 つが定番の選択肢になる。どれも tar と組み合わせて使えるが、圧縮率・圧縮速度・展開速度・並列対応が大きく異なる。

実務の早見表

形式 拡張子 圧縮率 圧縮速度 展開速度 一言
gzip .gz 互換性の王者
bzip2 .bz2 旧世代、出番減
xz .xz 最も遅い 圧縮率重視
zstd .zst 中〜高 速い 最速 万能・現代の本命

前提(対象環境)

  • 一般的な Linux ディストリビューション(Ubuntu / RHEL 系など)
  • zstd は古い環境では未インストールの場合がある(apt install zstd / dnf install zstd

各形式の特徴は?

結論: gzip は DEFLATE で速くて互換性抜群、bzip2 は BWT で圧縮率は中程度だが遅い、xz は LZMA2 で最高圧縮率、zstd は高速かつ調整幅が広い。

gzip — 互換性の標準

gzipDEFLATE(LZ77 + ハフマン符号)を使う。1992 年から存在し、ほぼあらゆる環境にインストール済み。圧縮率は 4 つの中で最も低いが、速くてどこでも展開できるのが最大の強み。HTTP の Content-Encoding: gzip をはじめ、配布フォーマットのデファクトスタンダード。

bzip2 — BWT 採用の旧世代

bzip2Burrows-Wheeler 変換(BWT) によるブロックソート圧縮。gzip より圧縮率は高いが、圧縮も展開も遅い。かつては「gzip より縮む」枠だったが、現在は xz・zstd に圧縮率でも速度でも劣るため、新規に選ぶ理由はほぼない。既存の .bz2 を展開する用途が中心。

xz — 圧縮率の最高峰

xzLZMA2 アルゴリズムを使い、4 つの中で最も高い圧縮率を出す。その代わり圧縮は最も遅く、高レベルではメモリも多く消費する。一度圧縮して何度も配布する(カーネルソース、ディストリのパッケージなど)用途に向く。

zstd — 現代の本命

zstd(Zstandard)は速度と圧縮率のバランスに優れた比較的新しい形式。gzip 並みの速度で gzip より高い圧縮率を実現し、レベルを上げれば xz に迫る圧縮率も狙える。展開が非常に速い点も大きく、Linux カーネル・btrfs・各種パッケージ管理で採用が進んでいる。

圧縮率と速度はどう違う?

結論: 圧縮率は xz ≧ zstd(高レベル) > bzip2 > gzip。展開速度は zstd > gzip > xz > bzip2。zstd は「速くてそこそこ縮む」を一台で満たす。

圧縮の世界は基本的に**「縮むほど遅い」というトレードオフ**で動く。各形式の傾向は次の通り。

  • 圧縮率: xz が最高。zstd は高レベルなら xz に迫る。bzip2 は中程度、gzip が最も低い
  • 圧縮速度: gzipzstd(低〜中レベル)が速い。bzip2 は遅く、xz は最も遅い
  • 展開速度: zstd が最速。gzip も速い。xz は中程度、bzip2 が最も遅い

重要なのは展開速度。圧縮は 1 回でも、展開は配布先で何度も走る。多数のサーバや CI で繰り返し展開するなら、zstd の展開の速さがそのまま効いてくる。

具体的な数値はデータの種類(テキスト / バイナリ / 既圧縮)と CPU で大きく変わる。自分の代表データで実測するのが唯一の正解。timels -l で計測すればよい。

$ for c in gzip bzip2 xz zstd; do \
    echo "== $c =="; \
    time $c -k -9 -f sample.dat; \
    ls -l sample.dat.* ; rm -f sample.dat.{gz,bz2,xz,zst}; \
  done

どう使い分ければいい?

結論: 配布互換性なら gzip、ディスク削減を最優先するなら xz、それ以外の大半は zstd でよい。bzip2 は既存ファイルの展開専用。

判断フローはシンプル。

  1. 相手の環境で確実に展開できる必要があるか?(古い環境・他人へ配布) → gzip.gz はどこでも展開できる)
  2. 保存容量・転送量を 1 バイトでも削りたいか?(アーカイブ、長期保管、配布回数が多い) → xz(圧縮は遅いが最も縮む)
  3. 上記以外(バックアップ、ログ、日常作業の大半)zstd(速い・よく縮む・展開が最速)
  4. .bz2 を受け取った/既存資産があるbzip2 で展開(新規圧縮には使わない)

ワンライン指針

  • 迷ったら zstd
  • 「相手に渡す」なら gzip
  • 「とにかく小さく」なら xz

基本的な使い方は?

結論: 4 形式とも cmd file で圧縮、cmd -d file.ext で展開、-k で元ファイルを残す、という共通の操作体系を持つ。

単体ファイルの圧縮・展開は、どのコマンドもほぼ同じ作法で扱える。

# 圧縮(元ファイルは消える点に注意)
$ gzip  file.txt        # → file.txt.gz
$ bzip2 file.txt        # → file.txt.bz2
$ xz    file.txt        # → file.txt.xz
$ zstd  file.txt        # → file.txt.zst(元ファイルは残る)

# 元ファイルを残して圧縮(-k = keep)
$ gzip -k file.txt
$ xz   -k file.txt

# 展開(-d = decompress)
$ gzip  -d file.txt.gz
$ xz    -d file.txt.xz
$ zstd  -d file.txt.zst

# 標準の展開専用コマンドもある
$ gunzip  file.txt.gz
$ bunzip2 file.txt.bz2
$ unxz    file.txt.xz
$ unzstd  file.txt.zst

gzip / bzip2 / xzデフォルトで元ファイルを削除する。残したい場合は -k(keep)を付ける。zstd は逆にデフォルトで元ファイルを残すため、消したい場合は --rm を付ける。挙動が逆なので注意。

中身を展開せずに確認したいときは、各コマンドの -c(標準出力へ)や zcat / bzcat / xzcat / zstdcat が使える。

$ zcat access.log.gz | grep 500
$ zstdcat backup.tar.zst | tar tf -

圧縮レベルとマルチスレッドは?

結論: いずれも -1-9 でレベル指定(数字が大きいほど高圧縮・低速)。xz と zstd は -T0 で全 CPU コアを使った並列圧縮ができ、大きく時短できる。

圧縮レベル

数字を上げるほど縮むが遅くなる。代表的なデフォルトは以下。

  • gzip: -1-9、デフォルト -6
  • bzip2: -1-9、デフォルト -9(ブロックサイズ)
  • xz: -0-9、デフォルト -6
  • zstd: -1-19、デフォルト -3。さらに --ultra -22 で最大レベルまで引き上げられる
$ gzip -9 file        # 最大圧縮
$ xz -9 file          # 高圧縮(遅い・メモリ多め)
$ zstd -19 file       # zstd の通常最大
$ zstd --ultra -22 file   # zstd の最大圧縮

マルチスレッド(並列化)

大きなファイルでは並列化が効く。

$ xz   -T0 big.tar    # 全コアを使って圧縮
$ zstd -T0 big.tar    # 全コアを使って圧縮(0 = 自動)

gzip / bzip2 自体は並列化に対応しないが、互換の並列実装がある。pigz(parallel gzip)と pbzip2 / lbzip2 を入れれば、.gz / .bz2 形式のまま全コアを活用できる。

tar と組み合わせるには?

結論: tar-z(gzip) / -j(bzip2) / -J(xz) のショートカットを持つ。zstd は --zstd、または拡張子から自動判定する -acaf)が便利。

複数ファイルをまとめるアーカイブ(tar)と圧縮は別の処理。tar のオプションで圧縮形式を指定する。

# 作成(c = create, f = file)
$ tar czf archive.tar.gz   dir/   # gzip
$ tar cjf archive.tar.bz2  dir/   # bzip2
$ tar cJf archive.tar.xz   dir/   # xz
$ tar --zstd -cf archive.tar.zst dir/   # zstd

# 展開時は形式を指定しなくても自動判定される
$ tar xf archive.tar.gz
$ tar xf archive.tar.zst

拡張子で自動判定(-a)

tar-a--auto-compress)を使うと、出力ファイル名の拡張子から圧縮形式を選んでくれる。形式を変えてもオプション(z / j / J)を覚え直さなくてよい。

$ tar caf archive.tar.zst dir/   # .zst → zstd
$ tar caf archive.tar.xz  dir/   # .xz  → xz
$ tar caf archive.tar.gz  dir/   # .gz  → gzip

古い tar(とくに非 GNU 環境)では --zstd-a が使えないことがある。その場合はパイプで繋ぐ。

$ tar cf - dir/ | zstd -T0 -o archive.tar.zst
$ zstd -dc archive.tar.zst | tar xf -

まとめと次の一歩

  • 迷ったら zstd。速度・圧縮率・展開速度・並列対応のバランスが最良
  • 配布・互換性なら gzip極限の圧縮率なら xz
  • bzip2 は新規採用の理由が薄い(既存 .bz2 の展開専用)
  • レベルは -1-9(zstd は -19/--ultra -22)、-T0 で並列化
  • 数値は環境依存。自分の代表データで実測してから決める

次に読む記事: