Archive for March 8th, 2009

xz utilsとgzip/bzip2の比較

Posted by 向井 淳 on Sunday, 8 March, 2009

なんか変だと思ったらすっかり勘違いをしていたことに今ごろ気づいた。LZMAの人たちが新しくxz utilsというのを作ってたのね。で、これまでLZMAに割り当てられていたJというフラグをxz utilsに割り当て直すとともに、.xzという拡張子もサポートしますよと。LZMA自体は2007年からずっとGNU tarでサポートされていて、拡張子としては.lzmaが使われていたらしい。そうだったのか……己の不明を恥じるのみです。

という訳でもう一度比較。昨日と同じファイルを使った。のでデータはxz utilsだけ。その他の環境は一緒。

圧縮後のサイズ。

2527556 Gauche.tar.xz

圧縮、伸長の時間。

% time xzcat -z Gauche.tar > Gauche.tar.xz xzcat -z Gauche.tar > Gauche.tar.xz 25.10s user 0.30s system 98% cpu 25.762 total % time xzcat Gauche.tar.xz > /dev/null xzcat Gauche.tar.xz > /dev/null 0.44s user 0.03s system 95% cpu 0.489 total

ということで、圧縮効率ではLZMAの方がちょっといいが、圧縮時間はちょっと短縮。逆に伸長時間はちょっと長くなっている。圧縮効率の問題かも。-0から-9まで指定できるようで、-9としても圧縮にかかる時間はそれほど変わらないが、ファイルサイズは2429624バイトまで減少してlzmaを抜いた。この辺のチューニングはまだこれからなのかも。

全体的にオプションとか使い方がgzip/bzip2に似ているのが嬉しいが、試した感じでははLZMAとよく似た挙動になっている。てことでたぶん基本的なアルゴリズムにはそう大きな変更はないのだろうから結論は変えなくていいのではないかと思う。ただ、lzmaもサポートされてたわりに全く広まった気配がないことを考えると、けっきょくgzとbz2の優位はゆるがないかもねえ、と思い直した。

ところでtrimpath-junctionの圧縮率が大して効率よくない件についてですが、逆にgzipでもかなりうまく圧縮できてしまっているのでそれほど改善されているように見えないというだけの話のような気がしないでもない。


LZMAで圧縮してみた

Posted by 向井 淳 on Sunday, 8 March, 2009

LZMAについては前にmasakiの雑記帳で存在だけは知っていたが試したことがなかった。今回gzipより圧縮効率が大きく向上した「xz」をサポートを読んでちょっと見てみた。

といっても結果はmasakiさんと変わらないので、リンク先だけ読むとよいよ。

手元にcheckoutしておいたいつかのバージョンのGaucheのソースコードを試した。gzip 1.3.10、bzip2 1.0.5、lzma 4.65での比較。

圧縮後のサイズ。

29419520 Gauche.tar 4725235 Gauche.tar.bz2 6605527 Gauche.tar.gz 2515224 Gauche.tar.xz

圧縮にかかる時間。

% time gzip -c Gauche.tar > /dev/null gzip -c Gauche.tar > /dev/null 2.11s user 0.03s system 99% cpu 2.153 total % time bzcat -z Gauche.tar > /dev/null bzcat -z Gauche.tar > /dev/null 6.85s user 0.06s system 99% cpu 6.928 total % time lzma e Gauche.tar -so > /dev/null LZMA 4.65 : Igor Pavlov : Public domain : 2009-02-03 lzma e Gauche.tar -so > /dev/null 30.77s user 0.23s system 99% cpu 31.203 total

伸長にかかる時間。

% time gzcat Gauche.tar.gz > /dev/null gzcat Gauche.tar.gz > /dev/null 0.32s user 0.01s system 98% cpu 0.329 total % time bzcat Gauche.tar.bz2 > /dev/null bzcat Gauche.tar.bz2 > /dev/null 1.79s user 0.02s system 99% cpu 1.820 total % time lzma d Gauche.tar.xz -so > /dev/null LZMA 4.65 : Igor Pavlov : Public domain : 2009-02-03 lzma d Gauche.tar.xz -so > /dev/null 0.37s user 0.02s system 93% cpu 0.409 total

lzmaは圧縮にかかる時間がとても長い。今回の計測ではgzipの15倍ぐらい。もちろん時間はターゲットによって変動するが、全体的にかなり重いように感じられる。ところが伸長はすごく速い。bz2は圧縮、伸長ともにそこそこの時間という具合。

なのでソフトウェアを配布する場合なんかではlzmaは非常に便利だ。今回tarがサポートしたことで、lzmaは重要なポジションを得るような気がする。gzがなくなることはないと思うが、たとえばこれからbz2の配布は減っていくというのはそんなにおかしな予測でもなさそうだ。

ところで興味深い事例をもう一つ。手元にあった他のファイルで圧縮後のサイズを比較してみた。

1925120 MochiKit-1.4.2.tar 280325 MochiKit-1.4.2.tar.bz2 383756 MochiKit-1.4.2.tar.gz 262442 MochiKit-1.4.2.tar.xz 10117120 trimpath-junction-1.1.22.tar 5511052 trimpath-junction-1.1.22.tar.bz2 5664840 trimpath-junction-1.1.22.tar.gz 5374993 trimpath-junction-1.1.22.tar.xz

これらの例でもlzmaは一番圧縮効率がいいのだが、あえてlzmaを選ぶほど圧縮効率が良くない。なぜなのかはよくわからないけれど、けっこう元のデータに依存するアルゴリズムなのか?

ところでcoreutil-7.1.tar.xzって確かに小さいんですが、私の手元のlzma 4.65だと伸長できません。なぜだ。→これについては翌日の記事も参照のこと。いろいろ勘違いでした。