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 — 互換性の標準
gzip は DEFLATE(LZ77 + ハフマン符号)を使う。1992 年から存在し、ほぼあらゆる環境にインストール済み。圧縮率は 4 つの中で最も低いが、速くてどこでも展開できるのが最大の強み。HTTP の Content-Encoding: gzip をはじめ、配布フォーマットのデファクトスタンダード。
bzip2 — BWT 採用の旧世代
bzip2 は Burrows-Wheeler 変換(BWT) によるブロックソート圧縮。gzip より圧縮率は高いが、圧縮も展開も遅い。かつては「gzip より縮む」枠だったが、現在は xz・zstd に圧縮率でも速度でも劣るため、新規に選ぶ理由はほぼない。既存の .bz2 を展開する用途が中心。
xz — 圧縮率の最高峰
xz は LZMA2 アルゴリズムを使い、4 つの中で最も高い圧縮率を出す。その代わり圧縮は最も遅く、高レベルではメモリも多く消費する。一度圧縮して何度も配布する(カーネルソース、ディストリのパッケージなど)用途に向く。
zstd — 現代の本命
zstd(Zstandard)は速度と圧縮率のバランスに優れた比較的新しい形式。gzip 並みの速度で gzip より高い圧縮率を実現し、レベルを上げれば xz に迫る圧縮率も狙える。展開が非常に速い点も大きく、Linux カーネル・btrfs・各種パッケージ管理で採用が進んでいる。
圧縮率と速度はどう違う?
結論: 圧縮率は xz ≧ zstd(高レベル) > bzip2 > gzip。展開速度は zstd > gzip > xz > bzip2。zstd は「速くてそこそこ縮む」を一台で満たす。
圧縮の世界は基本的に**「縮むほど遅い」というトレードオフ**で動く。各形式の傾向は次の通り。
- 圧縮率:
xzが最高。zstdは高レベルなら xz に迫る。bzip2は中程度、gzipが最も低い - 圧縮速度:
gzipとzstd(低〜中レベル)が速い。bzip2は遅く、xzは最も遅い - 展開速度:
zstdが最速。gzipも速い。xzは中程度、bzip2が最も遅い
重要なのは展開速度。圧縮は 1 回でも、展開は配布先で何度も走る。多数のサーバや CI で繰り返し展開するなら、zstd の展開の速さがそのまま効いてくる。
具体的な数値はデータの種類(テキスト / バイナリ / 既圧縮)と CPU で大きく変わる。自分の代表データで実測するのが唯一の正解。time と ls -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 は既存ファイルの展開専用。
判断フローはシンプル。
- 相手の環境で確実に展開できる必要があるか?(古い環境・他人へ配布)
→ gzip(
.gzはどこでも展開できる) - 保存容量・転送量を 1 バイトでも削りたいか?(アーカイブ、長期保管、配布回数が多い) → xz(圧縮は遅いが最も縮む)
- 上記以外(バックアップ、ログ、日常作業の大半) → zstd(速い・よく縮む・展開が最速)
.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、デフォルト-6bzip2:-1〜-9、デフォルト-9(ブロックサイズ)xz:-0〜-9、デフォルト-6zstd:-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、または拡張子から自動判定する-a(caf)が便利。
複数ファイルをまとめるアーカイブ(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 -