スポンサーリンク

bzip2

名称
書式
解説
オプション
メモリ管理
破損したファイルからデータを復元する
性能に関する注釈
警告
作者

名称

bzip2, bunzip2 − ブロックソーティングによるファイル圧縮器, v1.0.2
bzcat − ファイルを伸長して標準出力へ書き出す
bzip2recover − 破損した bzip2 ファイルからデータを復元

書式

bzip2 [ −cdfkqstvzVL123456789 ] [ filenames ... ]
bunzip2
[ −fkvsVL ] [ filenames ... ]
bzcat
[ −s ] [ filenames ... ]
bzip2recover
filename

解説

bzip2 は Burrows-Wheeler ブロックソーティングテキスト圧縮アルゴリズムと Huffman 符号を使ってファイルを圧縮します。圧縮率は大抵、より一 般 的 な LZ77/LZ78 を ベースとした圧縮器より大変良く、性能は統計的圧縮器の PPM ファミリに迫っています。

コマンドラインオプションは意図的に GNU gzip のものに似せてあります が、 同一ではありません。

bzip2 はコマンドラインフラグを伴ったファイル名のリストを受け取ります。 各ファイルは "original_name.bz2" という名前の圧縮済みファイルで置き換え ら れます。圧縮された各ファイルは、元のファイルと同じ更新時刻およびパー ミッションを持ち、そして可能なら同じ所有者となります。これによりこれ ら の 属性は伸長時に正しく復元可能となります。ファイル名の扱いは単純で、元 ファイルの名前、パーミッション、所有者、日付の概念が無いファイルシス テ ム や、 MS-DOS のようにファイル名の長さに大きな制限があるファイルシステ ムでは、それらを保存する機構はありません。

bzip2bunzip2 は、デフォルトでは既存のファイルを上書きしません。上書 きしたい場合は −f フラグを指定してください。

ファイル名が指定されない場合、 bzip2 は標準入力を圧縮して標準出力へ書き 出します。この場合 bzip2 は圧縮された結果を端末へ書き出しません。それは 全く読むことができず、出力することは無意味だからです。

bunzip2 ( ま たは bzip2 −d) は指定されたすべてのファイルを伸長します。 bzip2 で生成されたのではないファイルを検知・無視し、さらに警告を発し ま す。 bzip2 は以下のようにして圧縮済みファイルの名前から伸長後のファイル 名を推測します:

filename.bz2 は filename とします filename.bz は filename とします filename.tbz2 は filename.tar とします filename.tbz は filename.tar とします anyothername は anyothername.out とします

ファイル名が .bz2, .bz, .tbz2 または .tbz のような、認識できる名前で 終 わっ て い な い場合、 bzip2 は元のファイル名が推測できない旨を通知して .out を付加した名前を元のファイル名として使います。

圧縮の場合と同様に、ファイル名が指定されない場合は標準入力を伸長して 標 準出力へ書き出します。

bunzip2 は 2 つ以上の圧縮済みファイルを連結したファイルを正しく伸長しま す。得られるファイルは、伸長後のファイルを連結したものです。連結した 圧 縮ファイルに対しても健全性のテスト (−t) がサポートされています。

−c フラグを与えることで、ファイルを圧縮または伸長した結果を標準出力へ書 き出すことができます。このフラグを与えて、複数のファイルを圧縮または 伸 長 することができます。結果は標準出力へ順番に書き出されます。この方式に よる複数ファイルの圧縮では、複数の圧縮ファイルからなるストリームが生 成 さ れます。このストリームは、バージョン 0.9.0 以降の bzip2 でしか正しく 伸長できません。これより前のバージョンの bzip2 では、ストリーム中の最初 のファイルを伸長した後に停止します。

bzcat (または bzip2 -dc) は指定された全てのファイルを伸長し、標準出力に 書き出します。

bzip2 は引数として環境変数 BZIP2BZIP を順番に読み、コマンドラインか ら 読んだ引数より先に処理します。これはデフォルトの引数を与えるのに便利 です。

圧縮後のファイルが元のファイルよりも少し大きくなる場合でも、常に圧縮 は 行 われます。圧縮機構には常に 50 バイトのオーバヘッドがあるので、約 100 バイトよりも小さなファイルは大きくなる傾向があります。ランダムなデー タ ( ほとんどのファイル圧縮器の出力も) は 1 バイト当たり約 8.05 ビットで符 号化され、約 0.5% 大きくなります。

保護のための自己チェックとして、 bzip2 は、伸長後のファイルと元のファイ ルとの同一性を確かめるために 32 ビット CRC を使います。これにより、圧縮 済みデータの破損や bzip2 のまだ見つかっていないバグ (ほとんど無いはすで す) から守ります。データの破壊が検出できない確率は極めて小さく、各ファ イルの処理 40 億回あたり 1 回程度です。ただし、このチェックは伸長の時に し か行われず、したがって何か間違いが発生したことしか分かりません。圧縮 前の元データを復元するのには役に立ちません。破損したファイルからデー タ を復元するのに bzip2recover を試みることはできます。

戻り値: 正常終了の場合は 0 が返されます。実行環境の問題 (ファイルが見つ からない、無効なフラグ、入出力エラーなど) の場合は 1 が戻ります。 圧 縮 ファ イルが破損している場合は 2 が戻ります。 bzip2 にパニックを引き起こ す内部整合性エラー (例えばバグ) の場合は 3 が戻ります。

オプション

−c --stdout

圧縮または伸長した結果を標準出力に書き出します。

−d --decompress

伸長を強制します。 bzip2, bunzip2, bzcat は実際には同じプログラ ム で、どの動作をするのかは、どの名前が使われたかに基づいて決め られます。このフラグはそれよりも優先され、 bzip2 に伸長を強制さ せます。

−z --compress

−d の反対: 起動時の名前にかかわらず、圧縮を強制します。

−t --test

指 定されたファイルの健全性チェックをしますが、伸長はしません。 実際には伸長を試み、その結果は捨てています。

−f --force

出力ファイルの上書きを強制します。通常 bzip2 は既存の出力ファイ ルを上書きしません。さらに bzip2 にファイルへのハードリンクを切 断させます。このオプションが指定されていない場合は、ハードリ ン クの切断はされません。

bzip2 は通常、正しいマジックヘッダバイトを持たないファイルの伸 長を拒否します。強制 (-f) すると、そのようなファイルを修正せ ず にそのまま通過させます。これは GNU gzip の動作と同じです。

−k --keep

圧縮または伸長後でも入力ファイルを保存します (削除しません)。

−s --small

圧 縮、伸長、テストの際のメモリ使用量を減らします。ブロックバイ トあたり 2.5 バイトしか必要としないように変更されたアルゴリズム を 使って、ファイルの伸長やテストが行われます。全てのファイルが 2300k のメモリで伸長できますが、通常の約半分の速度になってし ま います。

圧 縮時に −s を使うと 200k のブロックサイズが選択されます。メモ リ使用量はほぼ同じ大きさに制限されますが、圧縮率が犠牲になり ま す。 つまり、マシンに搭載されているメモリが少なければ (8 メガバ イト以下) つねに −s フラグを使ってください。後述するメモリ管 理 の項目を参照してください。

−q --quiet

本 質的でない警告メッセージは出力しません。入出力エラーと致命的 なイベントに関連するメッセージは出力されます。

−v --verbose

詳細表示モードです。処理されたファイル毎に圧縮率を表示しま す。 さ らに −v を与えると詳細表示のレベルが上がり、主に診断を目的と する多くの情報が出力されます。

−L --license -V --version

ソフトウェアのバージョン、ライセンス条項とその条件が表示され ま す。

−1 (または −−fast) から −9 (または −−best)

圧 縮時のブロックサイズを 100 k, 200 k .. 900 k に設定します。 伸長時には何も影響がありません。下のメモリ管理の項目を参照し て ください。 −−fast と −−best という別名は、第一義的には GNU gzip との互換性のためです。特に、−−fast は非常に高速になるわけではあ りません。また、−−best は単にデフォルト動作を選択するだけです。

−-

これ以降の引数についてはダッシュで始まるものでもファイル 名 と して扱われます。これによりダッシュで始まるファイル名も扱うこ とができます。例えば次のように使います: bzip2 −- −myfilename

−-repetitive-fast --repetitive-best

これらのフラグは、バージョン 0.9.5 以降では冗長です。これらは以 前 のバージョンで整列アルゴリズムの動作を大雑把に制御するために 提供されたもので、時々は役立っていたものでした。 0.9.5 以降でこ れ らのフラグが無関係になる改良されたアルゴリズムが使われていま す。

メモリ管理

bzip2 は大きなファイルをブロック毎に圧縮します。ブロックサイズは達成 さ れる圧縮率と、圧縮または伸長に要するメモリの量に影響します。 −1 から −9 までのフラグは、それぞれブロックサイズを 100,000 バイトから 900,000 バ イ ト (デフォルト) に指定します。伸長時には、圧縮時に使われたブロックサ イズが圧縮ファイルのヘッダから読まれ、 bunzip2 はファイルを伸長するのに 十 分なだけのメモリを確保します。ブロックサイズは圧縮ファイルに格納され ているので、伸長時にはフラグ −1 から −9 は無関係であり、無視されます。

圧縮と伸長に必要なメモリ量は次のように見積もることができます:

圧縮: 400k + ( 8 x ブロックサイズ )

伸長: 100k + ( 4 x ブロックサイズ ), または 100k + ( 2.5 x ブロックサイズ )

ブロックサイズを大きくするにしたがい、効果は急速に減少していきます。 大 部 分の圧縮は最初の 200k あるいは 300k のブロックサイズで得られます。こ の事実を覚えておけば、小規模なマシンで bzip2 を使うときに役立つ で しょ う。 また、圧縮時に選択されたブロックサイズにより伸長に必要なメモリ量が 設定されることを知っておくのも重要です。

ブロックサイズがデフォルトの 900k で圧縮されたファイルを bunzip2 が伸長 する時は 3700 キロバイト必要です。 4 メガバイトしかメモリを搭載していな いマシンであらゆるファイルを伸長するために、 bunzip2 には、 約 半 分 の 2300 キロバイトの量のメモリを使うオプションがあります。伸長速度も半分に なるので、このオプションは必要な場合にのみ使うべきです。そのフラグは -s です。

一 般にはメモリ量が許す限り大きなブロックサイズを試して使ってください。 こうすることで最も高い圧縮率を達成できます。ブロックサイズは、圧縮と 伸 長の速度にほとんど影響しません。

単 一のブロックに収まっているファイルに関しては、もう一つの重要なポイン トがあります。これは大きなブロックサイズにした場合にほとんどのファイ ル が あてはまります。この場合、ファイルはブロックより小さいので、利用され る実メモリの量はファイルの大きさに比例します。例えば、長さが 20,000 バ イ トのファイルを -9 というフラグを与えて圧縮する場合、圧縮器は約 7600k のメモリを割り当てますが、そのうち 400k + 20000 * 8 = 560 キロバイト し か 使いません。同様に伸長器は 3700k を割り当てますが、 100k + 20000 * 4 = 180 キロバイトしか使いません。

異なるブロックサイズにおける最大メモリ使用量をまとめた表を示します。 ま た全部で 14 ファイル、合計 3,141,622 バイトからなるカルガリーテキスト圧 縮文献集を圧縮した後のサイズも示します。このカラムから、ブロックサイ ズ に よって圧縮がどのように変わるかを知ることができます。文献集は比較的小 さなファイルが多いので、この表は大きなファイルに対して大きなブロック サ イズを使った場合の利点を過小評価する傾向にあります。

圧縮時 伸長時 伸長時 文献集の フラグ 使用量 使用量 使用量 (-s) サイズ

-1 1200k 500k 350k 914704 -2 2000k 900k 600k 877703 -3 2800k 1300k 850k 860338 -4 3600k 1700k 1100k 846899 -5 4400k 2100k 1350k 845160 -6 5200k 2500k 1600k 838626 -7 6100k 2900k 1850k 834096 -8 6800k 3300k 2100k 828642 -9 7600k 3700k 2350k 828642

破損したファイルからデータを復元する

bzip2 はファイルを大抵 900 キロバイトのブロック毎に圧縮します。それぞれ のブロックは独立に扱われます。メディアや転送時の誤りにより、複数ブ ロッ ク からなる .bz2 ファイルが破壊された場合でも、ファイル中の破損していな いブロックからデータを復元できる可能性があります。

各ブロックの圧縮された表現は 48 ビットのパターンで区切られており、こ れ を 使ってブロックの境界を十分確実に見つけることができます。各ブロックは 32 ビットの CRC を持ち、破損したブロックを破損していないブロックと区 別 することができます。

bzip2recover は .bz2 ファイル中のブロックを探し、それぞれのブロックを別 々の .bz2 ファイルへ書き出す単純なプログラムです。その後で bzip2 −t を 使っ て得られた各ファイルの健全性をテストし、破損していないファイルを伸 長することができます。

bzip2recover は単一の引数として破損したファイルの名前をとり、抽出された ブロックを含む "rec00001file.bz2", "rec00002file.bz2"という大量のファイ ルを書き出します。出力されるファイル名はその後の処理でワイルドカード が 使 え る よ う に 設 計 されています。例えば "bzip2 -dc rec*file.bz2 > recovered_data" とすれば、ファイルを正しい順番で処理できます。

bzip2recover は大きな .bz2 ファイルを扱うときに最も役に立ちます。大きな .bz2 ファイルには大量のブロックが含まれているからです。破損したブロック の復旧はできないため、単一のブロックだけで構成されている破損ファイル に 対 し て は役に立たないのは明らかです。メディアや転送時の誤りで発生する データの損失の可能性を最小にしたい場合には、小さなブロックサイズで圧 縮 することが考えられます。

性能に関する注釈

圧 縮におけるソート段階では、ファイル中の類似した文字列を集めます。この ため、"aabaabaabaab ..." のように記号が何回も長く (数百回) 繰り返されて いるファイルを圧縮する場合は通常より遅くなります。バージョン 0.9.5 以降 では、以前のバージョンに比べてこの点がかなり改善されています。圧縮時 間 の 最も悪い場合と平均的な場合の比は 10:1 の範囲です。以前のバージョンで は 100:1 というような比でした。オプション −vvvv を与えることで、進行 状 況を大変詳しく見ることができます。

伸長の速度はこれらの現象に影響されません。

bzip2 は動作のために大抵数メガバイトのメモリを確保し、全くランダムにそ の領域を変更します。これは、マシンがキャッシュミスに対してどれだけの 速 度 で対処できるかが、圧縮や伸長の性能を大きく決定するということを意味し ます。このため、キャッシュミスの割合を減らすようにコードを少し変更す る ことにより、性能が大きく向上することがわかっています。 bzip2 はとても大 きなキャッシュを持つマシンで最高の性能を出すと考えられます。

警告

入出力エラーのメッセージはそれほど役立ちません。 bzip2 はできるだけ入出 力 エラーを検知し、正しく終了するように試みますが、何が問題なのかの詳細 は、時々かなり間違ったものになることがあります。

このマニュアルページは bzip2 のバージョン 1.0.2 について述べていま す。 こ のバージョンが生成する圧縮データは、前方互換性と、以前の公開リリース であるバージョン 0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1 に対する後方互換 性 が あります。ただし、次の例外があります: 0.9.0 以降は複数の圧縮ファイル を連結したファイルを伸長できますが、0.1pl2 はできません。ストリームの先 頭にあるファイルを伸長した後に停止します。

バージョン 1.0.2 以前の bzip2recover では、圧縮ファイル中のビットの位置 を表現するために 32 ビット整数を使っているので、512 メガバイトより長 い 圧 縮 ファイルを扱うことができませんでした。バージョン 1.0.2 以上では、 64 ビット整数をサポートするプラットフォーム (GNU がサポートするも の と Windows) の一部で、 64 ビット整数を使用しています。 bzip2recover にこの 制限が有るか無いかを確認するには、引数無し で 実 行 し て く だ さ い。 MaybeUInt64 を符号無し 64 ビット整数にして再コンパイルすれば、制限無し バージョンを作成可能です。

作者

Julian Seward, jseward@acm.org

http://sources.redhat.com/bzip2

bzip2 に含まれるアイディアは (少なくとも) 以下の人々による も の で す: Michael Burrows と David Wheeler (ブロックソート変換)、 David Wheeler ( 再掲、Huffman 符号化器)、 Peter Fenwick (オリジナルの bzip における構造 化 コーディングモデルと多くの改良)、 Alistair Moffat, Radford Neal そし て Ian Witten (オリジナルの bzip における算術符号化器)。私は、彼らの 助 け や支援そしてアドバイスに感謝しています。ドキュメントの情報源について は、ソース配布中のマニュアルを参照してください。 Christian von Roques は、 圧縮速度の向上のためにより速いソートアルゴリズムを探すことを勧めて くれました。 Bela Lubkin は、圧縮速度が最も遅い場合の改良を勧めてくれま し た。 bz* スクリプトは、GNU gzip 由来です。多くの人がパッチを送り、移 植性の問題について助けの手を差しのべ、マシンを貸し、アドバイスをくれ ま した。これらは概ね助けになるものでした。

スポンサーリンク