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
のほうを使うことにします。