「ネットワークが遅くて、数百 MB のファイルを送るのにかなり時間かかるんですよねぇ」という話を聞いたので、使っているツールを聞くと gzip だというので、bzip2 や xz を使うといいかもしれない、というふうに答えました。あとになって実際のところどうなのかと思ったので、実際にいくつかのパターンで圧縮、伸張にかかる時間と圧縮率を測ってみました。
用意したのは 20MB, 107MB, 1.1GB の3種類のファイルで、すべてプレインテキストですが、内容はバラバラです。使ったツールは gzip, bzip2, xz です。
20 MiB | 107 MiB | 1.1 GiB | |
---|---|---|---|
gzip (default) | 0.67 | 1.02 | 24.16 |
gzip (best) | 4.93 | 3.44 | 63.20 |
bzip2 | 1.73 | 7.43 | 270.56 |
xz | 8.18 | 11.85 | 346.63 |
どの組み合わせでもデフォルトレベルの gzip が一番早く、xz が一番時間がかかっています。
次に圧縮率を見てみます。ここでは元のファイルサイズから圧縮によってどの程度ファイルサイズが減少したかを圧縮率としています。圧縮率の右側の数字は圧縮後のファイルサイズです。
20 MiB (20,482,194) | 107 MiB (111,778,071) | 1.1 GiB (1,180,352,167) | ||||
---|---|---|---|---|---|---|
gzip (default) | 77.1% | 4,681,476 | 95.7% | 4,805,223 | 89.5% | 124,224,786 |
gzip (best) | 79.4% | 4,212,965 | 95.8% | 4,748,784 | 89.6% | 122,421,774 |
bzip2 | 90.7% | 1,912,758 | 96.1% | 4,379,552 | 92.8% | 84,921,781 |
xz | 94.3% | 1,160,628 | 97.6% | 2,660,448 | 97.9% | 24,357,044 |
xz の圧縮率の高さが目立ちますね。またファイルによらず他のものと比べると圧縮率が安定しています。残念ながら gzip は圧縮率をあげてもあまり効果はみられません。
20 MiB | 107 MiB | 1.1 GiB | |
---|---|---|---|
gzip (default) | 0.122 | 0.421 | 5.771 |
gzip (best) | 0.119 | 0.424 | 5.753 |
bzip2 | 0.440 | 1.033 | 27.478 |
xz | 0.107 | 0.457 | 5.604 |
圧縮とは異なり xz が gzip と同等のパフォーマンスです。つまり xzgrep などは zgrep などと同等のパフォーマンスが期待できるということを意味します。
この結果から判断するに gzip は圧縮率を上げずにデフォルトで使うのが良い感じです。gzip の使いどころとしては圧縮率はそこそこで圧縮と伸張の速度が重要なときが良さそうです。
bzip2 は圧縮速度を多少犠牲にしても圧縮率が欲しい時に使うのが良さそうです。圧縮したらあまり伸張することのない DB のダンプファイルなどに向いているかもしれません。
xz は圧縮速度よりも圧縮率と伸張の速度が重要なときに使うのが良さそうです。使いどころとしては後から grep や less などで閲覧することが多く、ファイルサイズの大きいログファイルなどでしょうか。成果物を配布するときにも良いですね。
まだあまりメジャーではない xz ですが、使いどころは多そうです。ちなみに tar も xz をサポートしています。以下のようにして使います。
1 |
tar Jcf foo.tar.xz foo |
適材適所で圧縮アルゴリズムを使い分けるといいですね。