bzip2の損益分岐点


アニメ『アキンド星のリトル・ペソ』

商売上手は無駄遣いもしません。損と得を常に意識して商売できるようになりたいです。

bzip2で圧縮するのはどのぐらいのサイズからが良いのか、テストファイルを作ってbzip2圧縮させながら確認したいと思います。
まずは、1バイトのファイル。当然bzip2をかけるとサイズが大きくなります。

takk@deb8:~$ echo -ne "\x0" > 1b
takk@deb8:~$ bzip2 1b
takk@deb8:~$ ls -l 1b.bz2
-rw-r--r-- 1 takk takk 37  4月 28 11:45 1b.bz2
takk@deb8:~$ 

次は、先ほど1バイトのファイルを圧縮したら37バイトになりましたので、37バイトのファイルをbzip2してみます。
内容は全部0です。

takk@deb8:~$ seq 37 | perl -ne "print chr 0" > 37b
takk@deb8:~$ bzip2 37b
takk@deb8:~$ ls -l 37b.bz2
-rw-r--r-- 1 takk takk 39  4月 28 11:51 37b.bz2
takk@deb8:~$ 

39バイトになりました。
では39バイトのデータで同じように試します。

takk@deb8:~$ seq 39 | perl -ne "print chr 0" > 39b
takk@deb8:~$ bzip2 39b
takk@deb8:~$ ls -l 39b.bz2
-rw-r--r-- 1 takk takk 39  4月 28 11:56 39b.bz2
takk@deb8:~$ 

同じサイズですね。

ではもっと大きくしてみます。きりのよい255バイトぐらいで。

takk@deb8:~$ seq 255 | perl -ne "print chr 0" > 255b
takk@deb8:~$ bzip2 255b
takk@deb8:~$ ls -l 255b.bz2
-rw-r--r-- 1 takk takk 39  4月 28 12:00 255b.bz2
takk@deb8:~$ 

これも同じサイズでした。次は512バイトでやってみます。

takk@deb8:~$ seq 512 | perl -ne "print chr 0" > 512b
takk@deb8:~$ bzip2 512b
takk@deb8:~$ wc -c 512b.bz2
41 512b.bz2
takk@deb8:~$ 

サイズが少し大きくなりました。どこからサイズが変化するのでしょうか。
手動でやると面倒なので、for文で大量生産してみます。

まず関数作成。

takk@deb8:~$ function create0(){
> seq $1 | perl -ne "print chr 0" > $1b
> }
takk@deb8:~$ 

各サイズのデータを生成して圧縮した結果をresultファイルに収めます。

takk@deb8:~$ for i in {39..512};do create0 $i && bzip2 ${i}b;wc -c ${i}b.bz2>>result;done
takk@deb8:~$ 

このような結果ができました。

takk@deb8:~$ head result
39 39b.bz2
39 40b.bz2
39 41b.bz2
39 42b.bz2
39 43b.bz2
39 44b.bz2
39 45b.bz2
39 46b.bz2
39 47b.bz2
39 48b.bz2
takk@deb8:~$ 

変化するファイルを特定してみます。

takk@deb8:~$ awk 'BEGIN{pre=""}{if($1 != pre){print $0}pre=$1}' result
39 39b.bz2
40 259b.bz2
41 260b.bz2
43 275b.bz2
41 499b.bz2
takk@deb8:~$ 

サイズが増えるばかりじゃないんですね。

コメント

タイトルとURLをコピーしました