GZ

GZファイルとは

ファイル 1 つを圧縮します。TAR と組み合わさって、Unix でおなじみの書庫になります。

GZ とは何か

GZ はストリーム形式です。先頭から末尾へ書かれ、同じ順に読まれます。 ウェブと長期保存のために使われます。

拡張子は .gz、正式名称は Gzip Archive です。ただしどちらも、そのファイルが中に何を持てるかほどには多くを語りません。このページの残りは、その中身についての話です。

GZ はどこから来たのか

1992 年までさかのぼります。 仕様は RFC 1952 です。

これだけ長く読まれ続けてきた形式なら、10 年後に取り出したいものを預けても大丈夫です。

仕様は公開されています

仕様書がそのまま公開されているので、中身を推し量るのではなく文書を読んで実装できます。この形式が数多くのプログラムに載っているのはそのためであり、20 年前に書かれたファイルが今も開けるのもそのためです。ただし「仕様が公開されている」ことと「使用料が要らない」ことは別の話です。中でコーデックを包んでいる形式では、特許のライセンスは仕様書が答えていない別の問題として残ります。

捨てられるものはありません

GZ ファイルは中身をそのまま保存します。保存し直しても何も変わらないので、開いて、直して、また保存する——それを何度繰り返しても劣化は積み上がりません。これが、渡すための形式ではなく作業のための形式である理由です。

ちょうど 1 ファイルを持ちます

GZ ファイルが圧縮するのはひとつながりの流れだけで、ファイル名やフォルダーというものを知りません。これが TAR と並んで現れることがこれほど多い理由です。TAR が、その足りない構造を足してくれます。

ほかに何を運べるか

GZ ファイルは全部が届く前に再生を始められる構造を持てます。

これは変換のときにとくに効いてきます。変換先が持てないものは落とされ、たいてい警告もありません。

この圧縮率がどこから来ているか

一度に扱う範囲は 32 KB です。繰り返しがこの幅の中に収まっていて初めて、それを圧縮で畳めます。

この数ひとつで、書庫形式どうしの違いのほとんどが説明できます。範囲が広ければ多くの繰り返しを見つけられ、そのぶん時間とメモリーを使います。取引はそれだけです。

自分を守るために何を備えているか

GZ ファイルは壊れたファイルが黙って誤読されるのではなく、壊れていると分かるようにするチェックサムを備えています。

チェックサムは何も直しません。ファイルが壊れていると教えてくれるだけです。ただしそれは、今それを知るか、送った相手から知らされるかの違いです。

GZ を開けるのは何か

gzip、7-Zip、Kekaが読めますし、同じ種類のプログラムならたいてい読めます。

ファイルが開かないとき、形式が悪いことはめったにありません。たいていはプログラムのほうが形式より古いのです。もっと古い形式に変換してしまうのが確実な逃げ道で、このサイトの残りの部分はそのためにあります。

ブラウザーで開く

これを読めるブラウザーはありません。

これを変換するいちばんよくある理由がこれです。形式が悪いのではありません。ファイルを見せたい場所が、それを読めないというだけのことです。

渡すための形式です

GZ は渡すために作られたもので、中で作業するためのものではありません。編集は可能ですが、快適だったためしはありません。賢い道は、元のファイルへ戻ってもう一度書き出すほうを通ります。

この形式でよく起きること

繰り返し挙がる不満はこれです。ひとつの流れしか扱えず、フォルダーを記述できない。

どれも、この形式を避ける理由にはなりません。どれかに不意を突かれる前に知っておくべきことがら、というだけです。これは別の主張であり、そして役に立つほうの主張です。

一つ入れて一つ出す、アーカイブではありません

gzip は一つのストリームを圧縮します。ディレクトリも名前の一覧も、複数ファイルという概念も持ちません。`notes.txt` を圧縮すれば `notes.txt.gz` が得られ、その中にはそれ以外何もなく、展開すればまさに圧縮した一つのファイルがそのまま戻ってきます。

これが `.tar.gz` が普通の形であり、拡張子が二つに分かれている理由です。tar がディレクトリツリーを一本のストリームにまとめ、gzip がそのストリームを圧縮する。連鎖は右から左に読みます。フォルダーを期待して素の `.gz` を展開すると、圧縮された唯一のファイルが手に入ります。この形式が持っていたのは最初からそれだけだからです。

世の中の gzip の大半はファイルではありません

それは HTTP のレスポンスです。ほぼすべてのウェブサーバーは HTML や CSS、JavaScript、JSON を gzip で圧縮して送り、ブラウザーは透過的に展開します。どちら側も .gz というファイルをどこにも書きません。これは一日に何十億回も起きていて、まったく見えません。

これが gzip がどこにでもあり、その比率よりも速度のほうが大事にされる理由です。レスポンスを圧縮するサーバーが持っている時間はミリ秒であって秒ではありません。十倍の労力で十パーセント硬く絞る圧縮ツールは、この規模では間違った取引で、これはまさに xz が選んで gzip が選ばない取引です。

ZIP や PNG の内側にもある DEFLATE

gzip は DEFLATE を使います。32 KB の窓に対する LZ77 のマッチングに続くハフマン符号化です。同じアルゴリズムが ZIP の中の各ファイルと、あらゆる PNG 画像を圧縮していて、これら三つの形式が似通った圧縮特性を持つ理由です。

32 KB の窓こそがこの形式を規定する限界です。それより離れた繰り返しは見つけられないので、長い距離にわたる構造を持つ大きなファイルでは gzip は xz や 7z に大きく劣ります。同時に、探索空間が設計上小さいので、動作コストがとても低いのもここに理由があります。

特許を回避するために書かれました

Jean-loup Gailly と Mark Adler は 1992 年に gzip を発表し、Unix の `compress` を置き換えました。`compress` は LZW を使っていて、ユニシスがその特許を持ち、行使を始めていました。GIF を PNG に置き換えたのと同じ紛争です。

DEFLATE は制約を受けない設計で意図的に作られ、誰でも実装できるよう RFC 1951 として公開されました。これが ZIP や PNG、HTTP、無数のプロトコルの中に組み込まれた理由です。使うのに許可を求めなくていい、十分に良い圧縮ツールだったのです。

レベルと、既定値が正しい理由

gzip はレベル 1 から 9 を提供します。レベル 1 は速く緩く、9 はいちばん粘り強く探し、6 が既定です。6 と 9 の間の差はたいていサイズにしてほんの数パーセントで、時間はかなり増えます。ほとんどの場面で割に合いません。

展開の速さはどのレベルを使っても実質一定で、しかも速く、普通のハードウェアで秒速数百メガバイトです。この非対称性がこの形式を定義する特徴で、読むのは安く、書くのもそこそこ安く、どちらも目覚ましいほどではないということです。

ファイルについて記録していること

ヘッダーには元のファイル名と更新日時、コメントを持てて、末尾には無圧縮データの CRC32 のチェックサムが付きます。このチェックサムのおかげで、破損は展開時に静かに間違った出力を出すのではなく検出されます。

格納された名前は、展開すると `.gz` に付いていた名前と違うものが出てくることがある理由です。これはプライバシー上も小さな注意点で、`.gz` はファイルを送るために名前を変えたあとでも、元のパスや名前を運んでいることがあります。

つなぎ合わせられる、これは珍しく便利です

二つの gzip ファイルを、ただファイルをコピーしてつなげるだけで、両方を順番に含む一つの有効な gzip ファイルが得られます。展開ツールは何も指示されずにそれを扱えます。

これがログのローテーションやストリーミングのパイプライン、データ収集システムがこの仕組みに頼る理由です。プロセスは以前に来たものを書き直したり読み返したりせずに、届いた圧縮済みの断片を追加していけます。ZIP も 7z もこれはできず、gzip がインフラの中で生き残っている理由の大部分がここにあります。

ほかの選択肢が勝る場面

xz はテキストでおよそ三割小さく圧縮でき、時間ははるかにかかります。何度もダウンロードされるリリースに向いています。zstd は gzip 並みの速さで xz に近いところまで圧縮でき、まさにそのためにパッケージ形式やバックアップシステムで gzip を置き換えつつあります。Brotli はウェブでは gzip を上回り、どのブラウザーでも対応しています。

gzip に残る利点は、インストールも設定も説明も要らずに、どこにでもすでにあるということです。これは無視できない価値ですが、既存のシステムではなく新しいシステムを作るなら、いまはたいてい zstd のほうが良い既定です。

ZIP に変換すべきとき

相手が機械ではなく人であるときです。ZIP は一般的な Windows や macOS がインストールなしで開けるもので、技術に詳しくない同僚に `.tar.gz` を送るのは、静かに解決すべき問題を押し付けているようなものです。

Unix のシステムに戻すために送るときは変換しないでください。ZIP への詰め直しは tar が運んでいた権限や所有者、シンボリックリンクを捨ててしまい、展開した結果が動かないことがあります。サーバーのバックアップやソースリリースにとって、`.tar.gz` は迂回すべき障害物ではなく、そのアーカイブが機能する理由そのものです。

基本情報

GZフォーマットの識別子と出自。
拡張子.gz, .tgz
メディアタイプapplication/gzip
初版1992
仕様RFC 1952