bzip2とgzipのParallel版、pbzip2とpigz
巨大なテキストファイルを圧縮する必要に迫られたのですが、標準のbzip2やgzipは並列処理に対応しておらず、今どきのマシンだともったいないです。
そこで調べてみると、それぞれのParallel版が見つかりました。pbzip2とpigzです。
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のほうを使うことにします。