6.

BZ2 / BZIP2(.bz2)完全ガイド — Burrows-Wheeler Transform・gzip との比較・xz への置換

編集
この記事の要点
  • bzip2 は Julian Seward が 1996 年に発表したストリーム圧縮形式で、gzip より高圧縮・低速というポジションを確立した
  • 中核アルゴリズムは Burrows-Wheeler Transform (BWT) + Move-to-Front 変換 + Huffman 符号化の 3 段構成
  • 単一ファイルのストリーム圧縮専用で、複数ファイルをまとめる機能はない(tar と組み合わせ .tar.bz2 / .tbz2 として使われる)
  • マジックナンバーは 42 5A 68(ASCII で BZh)、続くバイトでブロックサイズ(1〜9、100KB 単位)が示される
  • 2010 年代以降は xz/LZMA2Zstandard に置換が進み、新規採用は減少しているが、Linux 系ソース配布で依然現役
  • コマンドは bzip2 / bunzip2 / bzcat、並列版に pbzip2 / lbzip2
  • 元のファイルを置き換える破壊的動作がデフォルトなので、保持したい場合は -k(keep)オプション必須

概要

bzip2 は、1996 年に英国のプログラマ Julian Seward が発表したフリーソフトウェアのデータ圧縮プログラムおよびその出力形式です。当時主流だった gzip(DEFLATE)に対して「より時間をかけても良いので圧縮率を高めたい」というニーズに応える形で登場し、Linux/UNIX 系のソースコード配布フォーマットとして急速に普及しました。

名前の「bz」は内部で使う Burrows-Wheeler Transform(BWT)に由来するという俗説がありますが、Seward 自身は「特に深い意味はない」と述べています。「2」は前身のプロトタイプ「bzip」から仕様を変更した第二世代という意味で付与されました。

2010 年代に入ると、より高圧縮の xz(LZMA2) や、高速かつ圧縮率も高い Zstandard へと配布形式の主役が移りつつあります。Linux カーネル公式 tarball は 2013 年に bzip2 配布を停止し xz へ移行、Debian や Fedora の多くのパッケージも xz に置換されました。とはいえ、依然として古い OSS の tarball、組み込み Linux のソース配布、研究データのアーカイブなどで bz2 ファイルは大量に流通しており、現代のエンジニアも扱う必要があります。

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

bzip2 ファイルは固定ヘッダ(マジック + ブロックサイズ指定)で始まり、その後に複数の圧縮ブロックが連結されます。

オフセット内容値の例
0-2マジックナンバー42 5A 68 (BZh)
3ブロックサイズ(ASCII 数字)3139 ('1'〜'9'、100KB 単位)
4-9圧縮ブロック開始マーカ31 41 59 26 53 59
...圧縮データ本体BWT → MTF → Huffman
末尾EOF マーカ + CRC3217 72 45 38 50 90 + 32bit CRC

圧縮処理は次の 3 段で行われます。

  1. Burrows-Wheeler Transform (BWT): 入力ブロック(最大 900KB)の循環シフトを辞書順ソートし、最終列を取り出すことで「同じ文字が連続しやすい列」に並び替える。
  2. Move-to-Front (MTF) 変換: 直前に現れた文字を 0 に近い値へマップし、続けて RLE(連長符号化)でゼロの連続を圧縮する。
  3. Huffman 符号化: 出現頻度に応じた可変長符号で最終的にビット列へ落とし込む。

BWT は理論的に「順序を入れ替えるだけで情報は失わない」可逆変換であり、ここで「圧縮しやすい配置」を作ってから本来の圧縮を行うのが bzip2 の本質的アイデアです。

主な用途

  • OSS ソースコード配布: foo-1.2.3.tar.bz2 形式で公開される伝統的な tarball
  • 長期保管アーカイブ: 圧縮率重視で、解凍速度より保管サイズを優先する場合
  • ログ・データの圧縮: テキスト主体のデータで、gzip より一段高い圧縮率を得たい場合
  • 科学技術データ: ゲノム配列、FASTQ 等の繰り返しが多いテキストデータと相性が良い

関連形式との比較

形式アルゴリズム圧縮率速度メモリ使用量並列化
gzipDEFLATE (LZ77+Huffman)速いpigz で可
bzip2BWT+MTF+Huffman遅い中(〜7.6MB)pbzip2/lbzip2 で可
xzLZMA2非常に高非常に遅い大(〜数百MB)xz -T で可
zstdFSE+LZ77 派生中〜高(可変)非常に速い標準対応

コマンド・ツール

# 圧縮 (元ファイルは消えて file.txt.bz2 になる)
bzip2 file.txt

# 元ファイルを保持しつつ圧縮
bzip2 -k file.txt

# 圧縮レベル指定 (1=高速低圧縮, 9=低速高圧縮、デフォルト 9)
bzip2 -9 file.txt

# 解凍
bunzip2 file.txt.bz2
# または
bzip2 -d file.txt.bz2

# 標準出力に展開(パイプ用)
bzcat file.txt.bz2 | grep ERROR

# tar との組み合わせ (.tar.bz2 / .tbz2)
tar cjvf archive.tar.bz2 ./dir/      # j = bzip2
tar xjvf archive.tar.bz2             # 展開

# 並列圧縮(マルチコア活用)
pbzip2 -p4 -k large.log              # 4 並列で圧縮
lbzip2 -n 8 -k huge.dat              # 8 並列、より新しい実装

注意点・落とし穴

  • 破壊的動作がデフォルト: bzip2 file を実行すると file は削除され file.bz2 だけが残る。スクリプト内で使う場合は -k(keep)を忘れずに。
  • 並列化は標準実装にない: bzip2 本体はシングルスレッド。大きなファイルでは pbzip2 または lbzip2 を使わないと CPU を活かせない。
  • ランダムアクセス不可: ブロック単位の圧縮ではあるが、解凍時には先頭から順に処理する必要がある。巨大ファイルの一部だけ取り出すような用途には不向き。
  • xz/zstd への移行潮流: 新規プロジェクトで bz2 を選ぶ理由はほとんどない。配布効率(圧縮率)なら xz、速度なら zstd を優先するのが現代的。
  • ヘッダ破損の脆さ: 先頭の 4 バイトが壊れるだけで解凍不能になる。リカバリ機能は無いので、ミラー保管か別途 PAR2 等を併用すること。

関連リンク

編集
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)

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