LZMAで圧縮してみた

This entry was 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だと伸長できません。なぜだ。→これについては翌日の記事も参照のこと。いろいろ勘違いでした。

2 Responses to “LZMAで圧縮してみた”

  1. shiro

    Gauche.tarってfresh checkoutですか? それとも配布tarball?
    配布tarballだと多量の自動生成されたCコードが含まれているので、実質的なエントロピーがかなり低いかもしれません。

  2. 向井

    fresh checkoutです。