多数のファイルを圧縮するときはzipじゃなくてtar+gzipを使う

スタンダードなgzipはもちろんのことbzip2をも上回る高い圧縮率を誇る「xz」という形式が、ホットらしい。→ GNU tar 1.22リリース gzipより圧縮効率が大きく向上した「xz」をサポート:CodeZine
dankogaiによると「圧縮率はいいんだがCPUとメモリ食いすぎ(時間もかかりすぎ)じゃね?」とのこと→404 Blog Not Found:tips - xzってどうよ!?

この記事のタイトルにはtar+gzipって書いたけど別にtar+bz2でももちろんいい。
そんなことより聞いてくれよ>>1よ。

何年か前に後輩が書いた、バックアップ用(だったかな?)のちょっとしたシェルのコードを思い出したんだ。 ポイントだけ言うと、/foo/bar/yyyymmdd(日付ね) というディレクトリの配下に ディレクトリが20個くらいあって、それぞれのディレクトリには4kから10k程度の単純なテキストファイルが500個ほど入っている。合計10000ファイルくらいで80MByteくらい。こいつを全部ひとつのファイルにアーカイブ/圧縮してどっかに置いとけ、というシェルだとする。サーバのOSはLinux。

後輩の書いたシェル(の一部↓)
/usr/bin/zip -qr /var/backup/yyyymmdd.zip /foo/bar/yyyymmdd
できあがったファイルのサイズ↓
$du -h /var/backup/yyyymmdd.zip
10M
※ここでは比較のため仮に10メガだとする。

それを見た俺がはたと思って書き直したもの↓
/bin/tar czf /var/backup/yyyymmdd.tgz /foo/bar/yyyymmdd
できあがったファイルのサイズ↓
$du -h /var/backup/yyyymmdd.tgz
4M
(※たしかこのくらいの違いがでた覚えがある)

10Mと4M。倍以上の差。 「おー、tarってすごいんですね」と言った後輩にカラクリの詳細を教える暇が無いほど当時の俺は疲れていたし、「なんかあったときに客先が自分で掘り起こして見るためのバックアップファイルだから、zip圧縮のほうが親切だろ。ほら、最近のPCはWindows自体にzipファイルの展開機能がついてるしさ。」という風に仕様を切ったのは俺だった気がする(笑)。 とりあえずいま、カラクリをメモっておこう。

  1. データ圧縮技術とファイルアーカイブ技術は違う。
  2. データ圧縮とは、(ここではファイルの)サイズを文字通り圧縮=小さく=すること。 ものすごく簡単に言うと、「aaaaa」と書いてあったら「a5」とすれば5バイトが2バイトに圧縮される、的な理論。
  3. ファイルアーカイブとは、複数のファイルをつなぎあわせて一つのファイルにまとめることを言う。 圧縮は関係ない。
  4. とは言っても近年はファイルをアーカイブするなら圧縮もついでにやるケースがほとんどなので、 「本来はアーカイブと圧縮は別物」ということに気づかない人は意外にいる。
  5. gzipは圧縮のみでアーカイブ機能はない。 zipとtar(GNU tar)はアーカイブと圧縮の両方の機能を持つ。
  6. tarについて正確に言うと、tar(GNU tar)は圧縮オプションをコマンドに与えると内部で勝手にgzipやらbzip2やらを呼びだして圧縮処理してくれるという仕組み。
  7. zipとtarの大きな違いは、圧縮対象をディレクトリ(とその配下の複数のファイル)にしたとき、 zipはファイルをひとつずつ圧縮しながらアーカイブに加えてゆくのに対し、tarはアーカイブしてから最後にまとめて圧縮する。
  8. なお、gzip形式とzip(PKZIP)形式との間に、圧縮率の差はそれほどは無い。
  9. 沢山の単純なファイル=特に、何かの動作ログとか定型文とかそういうテキスト=を対象とする場合、小さいファイルをちょこまか圧縮してからアーカイブするよりも、小さいファイルをまとめて一つの大きなファイルにアーカイブしてから圧縮をかけるほうが圧縮アルゴリズム的には有利なので、上のような結果になることがある。

アーカイブ (コンピュータ) - Wikipedia

データ圧縮と併用する際、アーカイブは圧縮に先立つ工程として行われることが多いが、これは単一のファイルを個別に符号化するよりも、関連したファイルを一つのファイルと見なして符号化を行うことで、データ圧縮の効率を高めることができるためである。これをソリッド圧縮という。

しかしながら、圧縮したファイルを展開する際に、関連ファイルの全体を展開する必要が生じるため、ZIPのようにファイルを圧縮した後にアーカイブするフォーマットや、データ圧縮時に決まったサイズのブロックに分けて符号化することで、目的のファイル周辺のみを解凍して取得することができるフォーマットが多い。アーカイブファイルが圧縮効率と展開に際しての利便性はトレードオフの関係にあるため、データ圧縮規格が乱立する要因ともなっている。

件のシェルを含んだもろもろの物件をリリースした後、たしか、1,2年後あたりに/var/backup配下の容量がやばくなってきて古いファイルを移し変えたと伝え聞いた。逆に言うとあのシェルがzipコマンドのままだったらリリース後半年ちょっとでHDDの容量がやばくなっていたことだろう。後輩の書いたシェルのせいであることに気づかずに「サイジングの想定を超えたので云々」みたいなことになっていたかもしれない。

see also:

トラックバックURL

このエントリーのトラックバックURL:
http://www.ywcafe.net/mt/mt-tb.cgi/974

トラックバック

» エクスポーラが多くて驚いた とか(2009/05/11の雑記) from Hinemosu
エクスポーラ - Google 検索 予想外に「エクスポーラ」が多くて驚いた。なんかちょっと可愛らしい印象になるな。 「お金払って... 続きを読む

コメント

ところで、バックアップにはよくtar+gzipが使われますが、この「tarで固めて一気にgzipで圧縮」が危険なこともあるそうです。

もしファイルが壊れた場合、壊れた部分はもちろんそれ以降のファイル全てがダメになるとか。
See http://www.linux.or.jp/JF/JFdocs/Backup-mini-HOWTO/tar-gz.html

コメントする

(初めてのコメントの時は、コメントが表示されるためにこのブログのオーナーの承認が必要になることがあります。承認されるまでコメントは表示されませんのでしばらくお待ちください)


画像の中に見える文字を入力してください。