pigz | awk | wc是最快的方法
首先要使用FASTQ進行基準測試,最好使用具有已知答案的特定實際示例。我選擇了以下文件:
ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/phase3/data/HG01815/sequence_read/ERR047740_1.filt.fastq.gz
作為我的測試文件,正確的答案是:
讀取次數:67051220讀取的鹼基數:6034609800
接下來,我們想找到最快的計數方法,所有時間都是在其他未加載的系統上,用bash time
收集的10次運行的平均掛鐘時間(實際)。 / p>
zgrep
zgrep。 ERR047740_1.filt.fastq.gz | awk'NR%4 == 2 {c ++; l + = length($ 0)} END {print“讀取次數:” c; print“讀取的鹼基數:” l}'
這是最慢的方法,平均運行時間為125.35秒
gzip awk
使用 gzip
,我們又獲得了大約10秒鐘的時間:
gzip -dc ERR047740_1.filt.fastq.gz | awk'NR%4 == 2 {c ++; l + = length($ 0)} END {print“讀取次數:” c; print“讀取的鹼基數:” l}'
平均運行時間為116.69秒
Konrad的gzip awk wc變體
fix_base_count(){本地計數=($(cat))echo“ $ {counts [0]} $(($$ counts [1]}-$ {counts [0]}))”} gzip -dc ERR047740_1 .filt.fastq.gz \ | awk'NR%4 == 2' wc -cl \ | fix_base_count
在此測試文件上運行的速度比解決方案的 gzip awk
變體慢,平均運行時間為122.28秒。
kseq_test使用來自 klib
的最新 kseq.h
進行以下編譯的代碼: gcc -O2 -o kseq_test kseq_test.c -lz
其中 kseq_test.c
是Simon對Heng Li的FASTQ解析器的改編。
kseq_test ERR047740_1.filt.fastq.gz
平均運行時間為99.14秒,比到目前為止基於 gzip
核心實用程序的解決方案要好,但是我們可以做得更好!
piz awk
使用Mark Adler的 pigz代替 gzip
,請注意, pigz
在 gzip
之上為我們提供了速度上的提高,因為它除了主要的deflate線程外,還使用另外3個線程進行讀取,寫入和校驗和計算,請參見手冊頁有關詳細信息。
pigz -dc ERR047740_1.filt.fastq.gz | awk'NR%4 == 2 {c ++; l + = length($ 0)} END {print“讀取次數:” c; print“讀取的鹼基數:” l}'
現在平均運行時間為93.86秒,比基於kseq的C代碼快約5秒,但我們可以
pigz awk wc
接下來,我們將 pigz
替換為Konrad的 wc awk
基於解決方案的code>變體。
fix_base_count(){本地計數=($(cat))echo“ $ {counts [0]} $( ($ {counts [1]}-$ {counts [0]}))“} gzip -dc ERR047740_1.filt.fastq.gz \ | awk'NR%4 == 2' wc -cl \ | fix_base_count
現在平均運行時間降至83.03秒,這比基於kseq的解決方案快約16秒,比OPs zgrep
為基礎的解決方案。
接下來作為基準,讓我們看看運行時間中有多少是由於對輸入的 fastq.gz
文件進行解壓縮而導致的。
gzip單獨
gzip -dc ERR047740_1.filt.fastq.gz > / dev / null
平均運行時間: 105.95秒,因此基於 gzip
的解決方案(其中還包括 zcat
和 zgrep
,因為這些由 gzip
提供)永遠不會比 kseq_test
快。
pigz
pigz -dc ERR047740_1.filt.fastq.gz > / dev / null
平均運行時間:77.66秒,因此很明顯,另外三個線程用於讀取,寫入和校驗和計算提供了有用的優勢。更重要的是,利用 awk |時,此加速效果更大。基於wc
的解決方案,原因尚不清楚,但是我希望這是由於額外的寫線程所致。
有趣的是,所有線程的平均CPU使用率對於各種答案都非常有用,我已經使用GNU time / usr / bin / time --verbose
p整理了這些統計信息基於>
zgrep
的解決方案133%-必須以某種方式超過一個線程
gzip |基於awk
的解決方案99%-所有基於 gzip
的解決方案都以99%的CPU使用率運行單線程
pigz | awk
147%
gzip | awk | wc
99%與 gzip
pgiz | awk | wc
155%
kseq_test
99%
gzip > dev / null
99%
pigz > dev / null
155%
雖然 pigz
中的主deflate線程將在100%CPU負載下運行,但額外的3個不會相當多的內核佔用了100%的內核(通過平均150%的CPU使用率證明),但是它們確實可以減少運行時間。
我正在使用Ubuntu 16.04.2 LTS ** ,我的 gzip
, zcat
, zgrep
版本均為gzip 1.6,而 pigz
版本為2.3.1。 gcc
是5.4.0版
**我認為我的補丁程序級別實際上是16.04.4,但是我沒有重啟170天:p