gzip プログラムで作成したファイルを任意の場所で解凍することは、 DEFLATE 圧縮アルゴリズム(wiki)の性質上、原理的に不可能である。そのため、既存のプログラムでは、並列性を利用してgzipで圧縮された大きなファイルを高速に解凍することができない。これは、特に大規模なシーケンスデータ実験の解析において、満足のいかないボトルネックとなっている。ここでは、任意のテキストファイルの高速かつ正確な解凍を行う並列アルゴリズムとその実装であるpugzを提案する。その結果、pugzはgunzipよりも1桁以上速く、高度に最適化された逐次実装(libdeflate(Github))よりも5倍速いことを示した。また、関連する問題として、圧縮データへのランダムアクセスについても研究している。DNA配列を含むgzipで圧縮されたファイルの構造を解明するために、簡単なモデルと実験結果を示す。予備的な結果として、gzipで圧縮されたFASTQファイル内の配列へのランダムアクセスは、低圧縮レベルではほぼ実現可能であるが、高圧縮レベルでは近似的であることがわかった。
Githubより
これは概念実証のためのプロトタイプなので、いくつかの荒削りな部分があることを想定しています。例えば、いくつかのファイルでクラッシュする可能性があります。また、make asserts=0でコンパイルすると未定義の動作をすることがあります。 これは、ブロック化されたファイルやマルチパートファイルが現在サポートされていないためです。もしpugzがあなたの共有したい大規模なファイルのいくつかで詰まったら、問題を提起してください(レポジトリでissueを作成する)。
インストール
git clone https://github.com/Piezoid/pugz.git
cd pugz/
#For maximal performance, disable assertions
make asserts=0
> ./gunzip -h
$ ./gunzip -h
Usage: ./gunzip [-l] [-t n] FILE...
Decompress the specified FILEs.
Options:
-l count line instead of content to standard output
-t n use n threads
-h print this help
-V show version and legal information
テストラン
テストデータ(224Mのgzip file)がダウンロードされる。
cd example
bash test.sh
実行方法
gzip圧縮されたファイル、例えばfastqを指定する。
ここでは圧縮してから解凍する。23GBのraw fastq x 2(test_R1.fq, test_R2.fq)を使う。
#pigzで圧縮、16スレッド使用
pigz -p 16 test_R*
- -c Write all processed output to stdout (won't delete)
- -p Allow up to n compression threads (default is the number of online processors, or 8 if unknown)
test_R1.fq.gzとtest_R2.fq.gzができる。元のファイルを残すには-c > test_R1.fq.gzとする。
pugzを使って解凍する。16スレッド使用。
./gunzip -t 16 test_R1.fq.gz > test_R1.fq
./gunzip -t 16 test_R2.fq.gz > test_R2.fq
md5sum test_R2.fq.gz decompressed_R2.fq
レポジトリにもデータがあるが(単位は MB/s)、ここでは、上のfq.gzを使って解凍にかかる時間を調べてみた 。
1 thread => 41.2 seconds
2 threads=> 38.4 seconds
4 threads=> 33.7 seconds
6 threads=> 34.3 seconds
8 threads=> 31.6 seconds
12 threads=> 32.7 seconds
16 threads=> 21.9 seconds
24 threads=> 21.6 seconds
32 threads=> error
(n=1)
本家gunzipは106.9 secondsかかったが、2 threads指定で、本家gunzipの半分以下の時間で解凍された。
引用
Parallel decompression of gzip-compressed files and random access to DNA sequences
Maël Kerbiriou, Rayan Chikhi
arXiv, Submitted on 17 May 2019
参考
https://ja.wikipedia.org/wiki/Zlib
https://ja.wikipedia.org/wiki/Gzip
*1
手元にあった10x genomicsのfastqを使用した。計算機は3990x、256GB物理メモリ。空のIntel optane 905P SSD上にfastqを置いてテストした。