マルチコアCPUを活用したファイル圧縮
どちらの場合も、圧縮ファイルの復元は、それぞれの標準ツールで可能だ。つまり、pbzip2の圧縮ファイルにはbzip2を、mgzipの圧縮ファイルにはgunzipを使う。Fedora 8の場合、pbzip2のパッケージが標準リポジトリーにあり「yum install pbzip2
」でインストール可能。一方、mgzipは、ほとんどのディストリビューションでパッケージがなく、ソースからインストールする必要がある。
しかも、コンパイルでエラーが発生する。zlibヘッダーにはgz_header
が定義されているが、mgzip.cでも同じ変数が正当なgzipアーカイブの16進値を保持するために使われているからだ。
$ make gcc -g -O2 -c -o mgzip.o mgzip.c mgzip.c:40: error: 'gz_header' redeclared as different kind of symbol /usr/include/zlib.h:124: error: previous declaration of 'gz_header' was here mgzip.c: In function 'compress_infile_to_outfile': mgzip.c:530: warning: cast to pointer from integer of different size
解決は簡単。gz_header変数にプレフィックスを付け、それに合わせてこの変数への参照を修正すればよい。参照はmgzip.cの中に数カ所にある。プレフィックスは、gz_header
以外で適正なCの識別子であれば何でもよい。たとえば、mgzip_gz_header
などとする。
圧縮および復元機能
コマンドライン・スイッチは、どちらの場合も、使い慣れた非並列版のものとほぼ同じだ。ただし、並列版にはないオプションがある。たとえば、gzipのスイッチ--recursive
はmgzipにはない。
pbunzip2の並列処理能力を見ると弱点が1つある。マルチコアを活用して圧縮ファイルを復元できるのはpbzip2で圧縮したファイルの場合だけなのだ。pbzip2はファイルを部分ごとに圧縮し、pbunzip2はその各部分を並列に復元する、このときマルチコアが利用されるからだ。したがって、カーネル・ソースのミラーサイトからダウンロードしたlinux-2.6.23.tar.bz2を復元する場合も1つのコアしか使われないことになる。pbzip2がファイルを分割すると、それによって圧縮ファイルのサイズが増加するが、増加量はごくわずかとされている(pbzip2の説明書によると0.2%)。そこで、本体のbzip2プログラムがファイルを分割するようにしてはいかがだろう。シングルコアの利用者の負担はほとんど変わらず、マルチコアの利用者は大いに助かるはずだ。
下に両ツールの簡単な使用例を示す。bzip2とgzipの利用者には、いずれもお馴染みのものだろう。この数字でpbzip2による圧縮ファイルのサイズを確認すると、確かに非並列版とほとんど同じ、わずか0.46%大きくなるだけだ。
$ bunzip2 linux-2.6.23.tar.bz2 $ gzip -c linux-2.6.23.tar > linux-2.6.23.tar.gzip $ mgzip -c linux-2.6.23.tar > linux-2.6.23.tar.mgzip $ ls -lh -rw-r----- 1 ben ben 253M 2008-01-19 18:55 linux-2.6.23.tar -rw-rw-r-- 1 ben ben 56M 2008-01-19 18:57 linux-2.6.23.tar.gzip -rw-rw-r-- 1 ben ben 67M 2008-01-19 18:57 linux-2.6.23.tar.mgzip $ gunzip -c linux-2.6.23.tar.mgzip > linux-2.6.23.tar.mgzip-gunzip $ md5sum linux-2.6.23.tar.mgzip-gunzip linux-2.6.23.tar 853c87de6fe51e57a0b10eb4dbb12113 linux-2.6.23.tar.mgzip-gunzip 853c87de6fe51e57a0b10eb4dbb12113 linux-2.6.23.tar $ bzip2 -c -k -9 linux-2.6.23.tar > linux-2.6.23.tar.bzip2 $ pbzip2 -c -k -9 linux-2.6.23.tar > linux-2.6.23.tar.pbzip2 $ ls -lh -rw-r----- 1 ben ben 253M 2008-01-19 18:55 linux-2.6.23.tar -rw-rw-r-- 1 ben ben 56M 2008-01-19 18:57 linux-2.6.23.tar.gzip -rw-rw-r-- 1 ben ben 67M 2008-01-19 18:57 linux-2.6.23.tar.mgzip -rw-rw-r-- 1 ben ben 44M 2008-01-19 19:03 linux-2.6.23.tar.bzip2 -rw-rw-r-- 1 ben ben 44M 2008-01-19 19:01 linux-2.6.23.tar.pbzip2 $ ls -l -rw-r----- 1 ben ben 264704000 2008-01-19 18:55 linux-2.6.23.tar -rw-rw-r-- 1 ben ben 45488158 2008-01-19 19:03 linux-2.6.23.tar.bzip2 -rw-rw-r-- 1 ben ben 57928789 2008-01-19 18:57 linux-2.6.23.tar.gzip -rw-rw-r-- 1 ben ben 69968799 2008-01-19 18:57 linux-2.6.23.tar.mgzip -rw-rw-r-- 1 ben ben 45695449 2008-01-19 19:01 linux-2.6.23.tar.pbzip2
現行のpbzip2にも大きな欠点がある。mgzipは圧縮対象のデータをstdinから読めるためパッケージしたばかりのtarファイルをパイプを介して流し込むことができるが、pbzip2はstdinあるいはパイプを介して入力することができないのだ。したがって、pbzip2でtarファイルを圧縮するには、実体あるファイルとしてtarファイルを作る必要がある。以下に、マルチコアCPU上でpbzip2を使って圧縮したtarballを展開するコマンドと、tarファイルをpbzip2で圧縮するコマンドを示す。
$ pbunzip2 -c /tmp/test/linux-2.6.23.tar.pbzip2 | tar xvf - $ tar cvf linux-2.6.23.tar linux-2.6.23 $ pbzip2 -9 linux-2.6.23.tar $ tar cvO linux-2.6.23 | mgzip > linux-2.6.23.tar.gz