日記帳だ! with Tux on Libserver

二度目の大改造!! 日記帳…か?を継承し、より柔軟でパワフルなBlogに変身しました。

RSSに対応しています。リンク・コメント・トラックバックは自由にしていただいてほぼ問題ありません。
RSS購読方法、僕のリンク・コメント・トラックバックについての考えを読むことをおすすめします。

JavaScriptを有効にし、Cookieを受け入れ、以下のブラウザを使うことで完全なコンテンツが楽しめます。
Mozilla Firefox 3.0(Get Firefox)・Opera 9.6・Safari 3.2・Lunascape 4/5(Gecko)・Lunascape 5(WebKit)
Internet Explorer 7/8とそれを使うIEコンポーネントブラウザ(Lunascape・Sleipnirなど)

<< 過去

未来 >>

展開の性能ばかりよいLZMA、Linuxに来る

最近Twitterから教えてもらう技術ネタが多くて楽しいですね。
今日教えてもらったのはLZMAって圧縮の話。
LZMAは7zipの圧縮アルゴリズムの一つとして人気があったと思います。
これが最近GNU/Linux界で人気があると言うことです。
GNU/LinuxにおけるLZMAですが、gzip・bzip2と同様に使うようです。
ちなみにgzipのアルゴリズムDeflateはZIPのアルゴズムとしても使われているらしい。最近知った。
それはさておき、インストールしてみた。
# yum install lzma
これだけです。便利ですね。そしたらlzmaコマンドが入ります。
さて、使い方ですが、gzip・bzip2と同じですのでこんな感じです。
$ lzma target   #targetをLZMAにより圧縮してtarget.lzmaを作り、元ファイルを消す
$ lzma -d target.lzma #target.lzmaを展開して元ファイルを消す
$ lzma -c target > target.lzma #消したくなければ-cで標準出力へ出してリダイレクト
$ lzma -dc target.lzma > target
$ tar cvf - dir/ | lzma -c > out.tar.lzma
$ lzma -dc out.tar.lzma | tar xvf -
これらが基本的なgzip・bzip2の使い方をコマンドを変えて書いたものです。
実はこのコマンドたちは元のファイルを消しちゃうんですよね。おもしろいでしょ。
それがいやならどうするのって-cをつけるんですよ。これCopyのcです。
出力先を標準出力にするってコマンドなんですけど、それだけ考えたらなんでCopyなのさって思うけどね。
こうやってリダイレクトして使うことが想定されてるんですね。おもしろい。
ところがGNU/Linux使いならば、まず最後の2つは使ったことないと思う。
というのもGNU tarというやつはgzipならばzを、bzip2ならばjを付け足せば勝手にやってくれるんだよね。
けど基本に立ち返ればこういうことになるんです。
BSDの人もGNU tarだからこんなことやらないね。Solarisは違うらしい。
なお、最新のGNU tarではLZMA用オプションが追加されているらしい。
さて、速度の面ではどうなのかというのを実験で確かめてみた。
ターゲットはLinuxカーネルのtarballのtarの部分だ。
初めランダムなファイルでやったんだが、それでは圧縮がうまくいかないので実用的なファイルを持ってきた。
tarファイルは338MiBというえらい図体のファイル。まぁ圧縮すると軽くなりますが。
ちなみにMiBは1024KiBを1MiBとする単位、KiBは1024Bytesを1KiBとする単位。
僕は普通のSI接頭語のk・Mを使うのが好きなんだが、ファイルサイズを調べるduの表示が1024を単位としていたのでわかりやすく書いた。
まず、速さの点では未だ定評があるgzipで試す。
$ time gzip  linux-2.6.30.tar
real 1m14.846s
user 1m9.119s
sys 0m3.857s
$ du -h linux-2.6.30.tar.gz
73M linux-2.6.30.tar.gz
$ time gzip linux-2.6.30.tar;ls -l linux-2.6.30.tar.gz; time gzip -d linux-2.6.30.tar.gz
real 0m20.667s
user 0m10.273s
sys 0m4.755s
さすがgzip、すごく速いね。たった1分15秒で338MiBのファイルを73MiBまで圧縮してくれた。
圧縮にかかる時間を考えるとgzipはなかなかありがたいものです。
展開が21秒というのもなかなかです。
なので、とりあえず圧縮というところでgzipは役に立ちます。
大概のソースコードの配布は未だgzipによるtarballですが、
これはbzip2にしたら容量は小さくなるけど、そもそもそんなに重くないから処理が軽いgzipとしているのだと思います。
ただLinuxのカーネルほどにもなるとgzipでも重いんですね。73MiBは十分大きなファイルです。
そこで軽減するために現在はbzip2がメインです。
bzip2はどうかという話ですが同様にやってみた。
$ time bzip2 linux-2.6.30.tar
real 7m21.002s
user 7m12.102s
sys 0m3.446s
$ du -h linux-2.6.30.tar.bz2
57M linux-2.6.30.tar.bz2
$ time bzip2 -d linux-2.6.30.tar.bz2
real 1m50.682s
user 1m41.545s
sys 0m6.188s
重いね。圧縮には7分21秒かかっています。gzipと比べると相当ひどい。
それでサイズは57MiBか、gzipと比べるとよっぽどよくなっていますが、時間がなぁ。
うーん……こういうの見てるとgzipって弱いマシンでは結構有利だよね。
これの試験って実はLibserverでしてるのよね。こいつそんなに強くないからね。
展開も遅く1分50秒もかかっている。
とはいえ、これでも処理速度とのバランスはよい部類に入るらしい。
圧縮速度について言えばそんなに間違ってはいない、というのはLZMAとの比較でわかります。
そして、今日の本題LZMAですが、その結果はなかなか面白いものになっています。
$ time lzma  linux-2.6.30.tar
real 21m11.949s
user 20m47.397s
sys 0m8.025s
$ du -h linux-2.6.30.tar.lzma
48M linux-2.6.30.tar.lzma
time lzma -d linux-2.6.30.tar.lzma
real 0m30.208s
user 0m22.259s
sys 0m5.055s
圧縮に21分12秒もかかるとかひどい。そりゃ歯磨きしたりしている間に終わらんわな。
しかし圧縮能力はすさまじく48MiBにもなっている。すごい!
けどさぁ、21分かけてこれでもあんまりうれしくないよなぁ。というのがbzip2のときにも感じたこと。
しかし配布ファイルに使うにはわるくないというのが展開の結果である。
なんと30秒で展開できている。これはgzipともいい勝負だ。この展開速度こそLZMAの特徴。
実はGNU/Linux界で話題になっているのはこの展開速度の点なんですね。
Linux移植は2009年1月と、この世界では非常に新しい形式なのですが、
2.6.30からカーネルイメージの圧縮に選択して使うことができるそうです。
って僕がさっき圧縮展開のテストに使ってたカーネルのソースをコンパイルしたやつじゃないですか。
というわけで場所を選べば非常に有利であると言うことです。
考えられる使い道はこのような展開することが非常に多いところ、
それと圧縮率が高いが展開は軽いので、配布ファイルでは使われるかも。カーネルとかならいいかもね。
僕の感想ではまぁLZMAは当分は使わなさそう。
けどメインのマシンなら性能もいいから、tar.lzma、使ってみたいですね。
Lhazが対応すればうれしいですね。まぁ多分対応するための素地はあるんだろうが。
そういえば、tarballってtarのヘッダとかもまとめて圧縮するから圧縮率がいいんですよね。
ちなみにtarballってのはtarして圧縮したもの一般を言う言葉らしい。tar.gzもtar.bz2もtar.lzmaもtarballだね。
さっきgzip微妙だなとか言いましたけど、tar.gzはZIPよりもLHAよりも総合的な圧縮率は高いんですね。
確かこれ書いたことあったよな、というわけで探したらあった。(参考記事 : 優秀な圧縮はどれか?そりゃBZip2じゃないの)
当時はくわしい分析はしてませんが、結果は書いてあるとおりで確かにtarballの成績がいいです。
反面ファイル一覧とかは展開しないと取り出せないのでそこが悪いところですが。
7zipでLZMA使ったときよりもtar.lzmaのほうがよいのだろうか。まぁそのあたりはあとで検討してみよう。
(追記) lzmaとxzについて
どうもその後知ったのだが、Linux用にxzってのを作ったらしい。それによりLinuxでLZMAが使えるようになったのだとか。
LZMAのアルゴリズムのLinuxでの呼び名ということになるのかな。ちょっと詳しいことはなんとも。
なのでここで書いた.lzmaは.xzで、コマンドもlzmaコマンドをxzコマンドとしたほうが今後はよさそうです。
基本的には同じものだと思うんですけどね。けどちょっと違う動作をするらしい。
投稿してから記事を書き換える気にはならないので追記として書いておきました。
Author : hidemaro
Date : 2009/08/23(Sun) 23:25
Linux・Net・Web | Comment | trackback (0)
blog comments powered by Disqus

トラックバック

トラックバックURL取得

Tools