done is better than perfect

自分が学んだことや、作成したプログラムの記事を書きます。すべての記載は他に定める場合を除き個人的なものです。

bzip2とgzipのParallel版、pbzip2とpigz

bzip2とgzipのParallel版、pbzip2とpigz

巨大なテキストファイルを圧縮する必要に迫られたのですが、標準のbzip2gzipは並列処理に対応しておらず、今どきのマシンだともったいないです。

そこで調べてみると、それぞれのParallel版が見つかりました。pbzip2pigzです。

Ubuntu 14.04では公式のリポジトリに含まれているようです。早速インストールして、簡単に圧縮解凍のベンチマークを取ってみました。

使うデータは約15GBのcsvファイルです。ほとんどの要素が0のいわゆるsparseなデータなので、圧縮後のデータサイズは物凄く小さくなることが予想されます。

前準備

2つともUbuntuならコマンド一発で入ります。

$ sudo apt-get install pbzip2
$ sudo apt-get install pigz

実験

今回使用するのは8コア16GBのマシンです。OSはXubuntu 14.04です。

最初にpbzip2の圧縮時の結果です。

$ pbzip2 -v big.czv
Parallel BZIP2 v1.1.8 - by: Jeff Gilchrist [http://compression.ca]
[Jun. 10, 2012]               (uses libbzip2 by Julian Seward)
Major contributions: Yavor Nikolov <nikolov.javor+pbzip2@gmail.com>

         # CPUs: 8
 BWT Block Size: 900 KB
File Block Size: 900 KB
 Maximum Memory: 100 MB
-------------------------------------------
         File #: 1 of 1
     Input Name: toefl11_train_XY.csv
    Output Name: toefl11_train_XY.csv.bz2

     Input Size: 17493172224 bytes
Compressing data...
    Output Size: 11272553 bytes
-------------------------------------------

     Wall Clock: 1324.476581 seconds

pbzip2の解凍時の結果です。

$ pbzip2 -vd big.csv.bz2
Parallel BZIP2 v1.1.8 - by: Jeff Gilchrist [http://compression.ca]
[Jun. 10, 2012]               (uses libbzip2 by Julian Seward)
Major contributions: Yavor Nikolov <nikolov.javor+pbzip2@gmail.com>

         # CPUs: 8
 Maximum Memory: 100 MB
 Ignore Trailing Garbage: off
-------------------------------------------
         File #: 1 of 1
     Input Name: toefl11_train_XY.csv.bz2
    Output Name: toefl11_train_XY.csv

 BWT Block Size: 900k
     Input Size: 11272553 bytes
Decompressing data...
    Output Size: 17493172224 bytes
-------------------------------------------

     Wall Clock: 170.868711 seconds

次に、pigzの圧縮時の結果です。-vオプションでは実行時間などが出力されなかったため、timeコマンド使用。

$ time pigz -v big.csv
big.csv to big.csv.gz 
pigz -v big.csv  275.25s user 42.45s system 172% cpu 3:04.27 total

解凍の結果です。

$ time pigz -vd big.csv.gz
big.csv.gz to big.csv 
pigz -vd big.csv.gz  34.31s user 61.53s system 56% cpu 2:50.63 total

結果のまとめです。

圧縮時間 解凍時間 圧縮後サイズ
pbzip2 1324秒 171秒 11MB
pigz 184秒 171秒 32MB

あれ、解凍時間が変わらない…?

結論

圧縮時間は圧倒的な差が有りましたが、解凍時間は何故か変わらないという結果に。topで見張っていてもpigzで解凍しているときはコアを1つしか使っていなかった…。何故だろうか。

圧縮後のサイズは当然pbzip2のほうが小さくなりました。元がsparseなので、pigzのほうでも実用上は大したことがなさそう。圧縮の時間が短いため、自分の用途ではpigzのほうを使うことにします。

参考