BZ2 を GZ に変換 — 展開を速くする

BZ2 を GZ にする変換は、容量とわずかに引き換えに速さを大きく得ます。bzip2 は最大 900 KB のブロックに対する Burrows-Wheeler 変換で圧縮率を稼ぎますが、それを解くのは本物の計算量を要する処理です。gzip の 32 KB の後方参照はメモリー転送に近い速さで展開できます。結果はわずかに大きく、ずっと速く開くファイルです。

  • 処理される場所 当サイトのサーバー上です。この処理に必要なソフトウェアは、ブラウザーでは動かせません。
  • 可逆 何も捨てられません。GZはBZ2が持っていたものをそのまま保持します。
  • ファイルサイズの上限 1ファイルあたり25MBまで。無料、アカウント不要です。
  • 知っておきたいこと ファイルは 1 バイトも変わらずに出てきます。失われるのは、容れ物が中身として持っていたものではなく、中身について持っていたもの——パスワードや、形式によっては元のアクセス権と日時です。

一度に100ファイルまで。フォーマットが混ざっていても構いません。

誰も書き直さなかったパイプラインに残る bzip2

bzip2 には良い 10 年がありました。おおよそ 1998 年から 2010 年ごろ、gzip では足りないときの当然の答えで、その時期に公開されたものの多くはいまも .tar.bz2 のままです。参照データセット、コーパス、カーネルやソースの tarball、CI が誰も入社する前からずっと毎回ダウンロードしているフィクスチャなど。

アーカイブ自体が問題なのではありません。何かが定期的にそれを展開していて、bzip2 の展開速度がビルドログに見えるほど遅いことが問題です。上流のリリースを作り直す人はいないので、実務的な対応はローカルで速く開く形式に詰め直し、それをキャッシュすることです。これはストレージのために変換する読者とは違い、答えも XZ ではなく gzip になります。

ブロックの並べ替えを解くのが後方参照をたどるより高くつく理由

2 つの形式の展開方法は構造的に異なり、この差は実装の質の問題ではありません。gzip の出力はリテラルバイトのコピーと、32 KB の窓の中の過去の繰り返しのコピーで組み立てられます。内側のループは実質メモリー移動で、今のハードウェアはこれが極めて得意です。

bzip2 は最大 900 KB のブロックごとに Burrows-Wheeler 変換を反転しなければなりません。並べ替えられた順列から元の順序を再構築する処理で、ブロック全体にわたる散らばった、キャッシュに不親切な走査を、出力の 1 バイトが確定する前に行い、さらに move-to-front とハフマン層も解きます。これは本物の計算であってデータ移動ではなく、どれだけ調整してもメモリー速度にはなりません。

返す容量と、まったく差がない場合

GZ は大きくなると見込んでください。その差はまったく内容次第です。bzip2 は一度に最大 900 KB の文脈を見るのに対し gzip は 32 KB しか見ないので、文章やログ、CSV、ソースコード、XML では gzip が届かない繰り返しを bzip2 は見つけ、差は本物です。

それ以外の中身では測るほどの差がありません。JPEG や PNG、MP3、MP4、あるいはすでに圧縮されたデータベースファイルの bzip2 アーカイブは、そもそもほとんど圧縮されていません。冗長性はアーカイブ化される前にそれぞれの形式が取り除いているからです。この場合、gzip への詰め直しはほとんど無料で速さの利点をまるごと得られます。

名前を持たないストリームと、それが生んだバグ

gzip のストリームはヘッダーに元のファイル名を保持します。bzip2 のストリームは名前もパスも手がかりも何も持ちません。この非対称性は普段は些細な話ですが、この変換機で本物の不具合を生みました。

詰め直しは圧縮アーカイブの中の TAR をほどく必要があり、最初のコードはファイル名でそれを判定していました。GZ からなら gzip が `output.tar` という名前を覚えていたのでうまくいきましたが、BZ2 や XZ からは同じ tarball が `input` という名前で届き、判定を通り抜け、結果は 30 個のファイルではなく 1 個の不透明なファイルを含むアーカイブになりました。修正は名前から推測するのではなく tar の種類を強制することで、今日 bzip2 のソースが正しく処理される理由です。

gzip は bzip2 が届かなかった場所にあります

普及率がこの変換のもう半分の論拠で、過小評価されがちです。DEFLATE は HTTP の `Content-Encoding: gzip` の中にも、PNG の中にも、ZIP ファイルの中にも、Git のオブジェクトの中にもあります。主要な言語のほとんどが標準ライブラリに持っています。Python の gzip、Go の compress/gzip、Java の GZIPInputStream、Node の zlib。依存関係を足す必要も、ライセンスを確認する必要もありません。

bzip2 は別途存在しなければならないライブラリで、最小構成のコンテナやロックダウンされた実行環境、ブラウザー、クラウド関数ではしばしば入っていません。gzip は登録された HTTP のコーディング方式ですが bzip2 は一度もそうなったことがないので、あらゆる HTTP クライアントは前者を展開でき、後者は展開できません。

失う耐障害性

得るものだけでなく失うものも述べておく価値があります。bzip2 は各ブロックを独立して圧縮するので、1 つのブロックの破損がそれ以降すべてを自動的に壊すわけではなく、復旧ツールは壊れたファイルを歩いて無事なブロックを救い出せます。gzip のストリームにはそうした構造がなく、途中でビットが反転すると通常そこでアーカイブは終わります。

これがどれだけ重要かは、ファイルの置き場所次第です。チェックサムを持つ最新のファイルシステムや、返す内容を検証するオブジェクトストレージ、あるいは複製がある場所では、ほとんど問題になりません。かけがえのないものの唯一のコピーを保持する古い単一のディスクでは重要になり得ますが、その場合の正しい答えはどちらの形式でもなく、ファイルごとの整合性データを持つ本物のバックアップです。

gzip ではなく XZ へ跳ぶべきとき

アーカイブが読まれるためではなく保管されるためのものなら、gzip は間違った行き先で、XZ が正しい行き先です。同じ中身を bzip2 よりかなりよく圧縮し、それでも展開は bzip2 より速いままです。このページの読者はそちらではありませんが、bzip2 アーカイブを変換している人の多くはそちら側なので、伝えておく価値があります。

判断は単純です。展開頻度を数えてください。頻繁に、機械によって、誰かが待っているステップの中で展開されるなら gzip。稀に、人が、ギガバイト単位で課金されるバケットから展開するなら XZ。bzip2 を残すべき唯一の場面は、メモリーがごく少ない機械です。bzip2 の固定 900 KB ブロックはほとんど何も必要としませんが、XZ は辞書サイズに応じたバッファーを要求します。

アーカイブが展開される場所

あなたの端末ではなく、このサイトのサーバーです。多くの変換はローカルで完結しそう明言していますが、アーカイブの詰め直しはその例外です。7-Zip と gzip を実際のプログラムとして必要とするからです。ファイルは暗号化された接続でそれらを動かすコンテナへ送られ、そのコンテナには外向きのインターネット接続がありません。

ジョブごとにメモリー上の使い捨てディレクトリが割り当てられ、成功しても失敗してもジョブが終われば削除され、60 秒を過ぎると打ち切られます。bzip2 は展開が遅く、文章の大きなアーカイブはまさに時間がかかる入力なので、この制約は現実に効いてきます。無料枠は 1 ファイル 25 MB までで、展開前にアーカイブが申告する展開後の容量を確認し、2 GB を超える申告は拒否されます。

BZ2 を GZ に変換する手順

  1. お手元の BZ2 ファイル をこのページに落とすか、押してファイルを選んでください。
  2. 変換先に GZ を選び、変換を開始します。
  3. できあがった GZ ファイル をダウンロードします。

BZ2 と GZ——何が変わるか

BZ2とGZの比較
BZ2GZ
正式名称Bzip2 アーカイブGzip アーカイブ
拡張子.bz2.gz, .tgz
メディアタイプapplication/x-bzip2application/gzip
圧縮方式可逆 — 何も捨てない可逆 — 何も捨てない
最初の公開19961992
仕様RFC 1952
ライセンスオープン標準オープン標準
現在の位置づけ旧式、ただし今もどこでも読める現行
ブラウザで開けるか対応なし対応なし
代わりに検討される形式XZXZ, ZIP

残るもの

失われるものはありません。BZ2 も GZ も中身を劣化なしに保持します。この変換が変えるのは包み方であって品質ではないので、劣化が積み重なる心配をせずに何度でも繰り返せます。

結果を開く

BZ2 は 1996 年のもので、今ではほとんど使われていません。GZ は今のプログラムが書き出す形式なので、この変換は「読める状態を保つ」という話でもあります。

7-ZipとKekaは BZ2 と GZ のどちらも読めるので、別のプログラムを開かずに、結果を元のファイルと並べて確かめられます。

ファイルサイズと品質

GZ が一度に扱う範囲は 32 KB、BZ2 は 900 KB です。繰り返しがこの幅の中に収まっていて初めて、それを圧縮で畳めます。圧縮率の差はそこから来ます。そしてだからこそ、2 つのうち速いのはこちらです。

どちらの形式が何のためのものか

GZ は 1992 年から使われています。規定は RFC 1952 です。gzip、7-Zip、Kekaがこの形式を読めます。

BZ2 から GZ:よくある質問

BZ2 ファイル はどこかにアップロードされますか。

はい。この変換には、ブラウザーの中では動かないソフトウェアが必要です。ファイルは暗号化されて当方のサーバーへ送られ、処理が終わり次第削除されます。結果のファイルも 60 分後に削除されます。

BZ2 から GZ への変換は無料ですか。

はい。25 MB までのファイルなら 1 日 100 回まで無料です。この変換だけは当方が費用を負担するサーバーで動くため、ここに上限があります。それ以外に制限はなく、透かしはどの場合も入りません。

BZ2 を GZ に変換すると品質は落ちますか。

いいえ。GZ は同じ内容を何も捨てずに保持できるので、結果は品質の点で元のファイルと同じです。 ファイルは 1 バイトも変わらずに出てきます。失われるのは、容れ物が中身として持っていたものではなく、中身について持っていたもの——パスワードや、形式によっては元のアクセス権と日時です。

BZ2 から GZ への変換は可逆ですか。

失われるものはありません。BZ2 も GZ も中身を劣化なしに保持します。この変換が変えるのは包み方であって品質ではないので、劣化が積み重なる心配をせずに何度でも繰り返せます。

これらのフォーマットについて