我對于parallel并行的簡單理解即同時(shí)執(zhí)行多個(gè)命令語句。它與For循環(huán)語句的逐條運(yùn)行的思路大相徑庭。盡管目前很多生信軟件支持多線程運(yùn)行(一條命令語句內(nèi)),但并不是設(shè)置的越多就越快,比如trim_galore命令建議對于一對fastq文件,不超過8個(gè)線程。因此,如果想盡可能利用計(jì)算機(jī)幾十個(gè)線程的資源,可以同時(shí)運(yùn)行多個(gè)trim_galore。誠然可以通過開啟多個(gè)終端命令,但parallel提供了更加便捷的并行方式。
1、conda安裝
#使用conda安裝可以避免root權(quán)限的限制
conda install -c conda-forge parallel
parallel --help
2、調(diào)用方法
- 常規(guī)命令語句 = 命令 + 參數(shù)
由于命令是固定的(trim_galore...),但參數(shù)是根據(jù)任務(wù)量而定的(many pairs fastq.gz files)
2.1 ::: 傳遞參數(shù)
-
--dryrun僅打印而不運(yùn)行命令語句
echo A
echo B
echo C
parallel echo ::: A B C
2.2 :::: 將參數(shù)/命令儲存到文件里,然后以文件名傳遞參數(shù)/命令
#傳參數(shù)
cat > parameter.txt
A
B
C
parallel echo :::: parameter.txt
parallel --dryrun echo :::: parameter.txt
echo A
echo B
echo C
#傳命令
for i in A B C
do
echo echo ${i} >> command.txt
done
parallel --dryrun :::: command.txt
parallel :::: command.txt
2.3 傳遞多參數(shù)
parallel echo ::: A B C ::: D E F
# A D
# A E
# A F
# B D
# B E
# B F
# C D
# C E
# C F
parallel --xapply echo ::: A B C ::: D E F
# A D
# B E
# C F
parallel --xapply echo {1} {2} ::: A B C ::: D E F
# A D
# B E
# C F
parallel --xapply echo {2} {1} ::: A B C ::: D E F
# D A
# E B
# F C
2.4 關(guān)于大括號的使用
- 如上當(dāng)傳遞多個(gè)參數(shù)時(shí),使用{數(shù)字}形式可以靈活指定參數(shù)的位置
- 當(dāng)參數(shù)為文件名(帶路徑)時(shí),大括號的特殊用法可以實(shí)現(xiàn)巧妙組合
#組成字符串
parallel echo chr{}.fa ::: {1..22} X Y M
chr1.fa
chr2.fa
chr3.fa
chr4.fa
chr5.fa
chr6.fa
chr7.fa
chr8.fa
chr9.fa
chr10.fa
chr11.fa
chr12.fa
chr13.fa
chr14.fa
chr15.fa
chr16.fa
chr17.fa
chr18.fa
chr19.fa
chr20.fa
chr21.fa
chr22.fa
chrX.fa
chrY.fa
chrM.fa
parallel echo cp {} {.}.test ::: ./*.txt
# cp ./a.txt ./a.test
# cp ./b.txt ./b.test
# cp ./c.txt ./c.test
#如果只有一個(gè)參數(shù),使用大括號即可指代該參數(shù)。如下,與上面命令等價(jià)
parallel echo cp {1} {1.}.test ::: ./*.txt
- 大括號的妙用
{} – full name 全名
{.} – one less file extension 以(最后一個(gè))逗號為分隔符的前半部分
{/} – remove directory path 去除路徑
{//} – directory path 僅保留路徑
{/..} – remove directory path and two levels of file extension
echo dir1/dir2/file.txt.gz | parallel --plus 'echo -e {}\\n{.}\\n{/}\\n{//}\\n{/..}'
# dir1/dir2/file.txt.gz
# dir1/dir2/file.txt
# file.txt.gz
# dir1/dir2
# file
3、生信分析實(shí)例
- 由于生信軟件大部分也支持多線程運(yùn)行,因此再同時(shí)執(zhí)行多條命令語句時(shí),有可能會超過計(jì)算機(jī)的最大線程數(shù);
- 可以使用
-j參數(shù),指定同時(shí)執(zhí)行的命令數(shù); -
--verbose參數(shù)可以在執(zhí)行命令語句前,先打印出該命令; -
--progress參數(shù)可以實(shí)時(shí)顯示任務(wù)的完成進(jìn)度
3.1 samtools flagstat
ls *bam
# SRR12720999.bam SRR12721000.bam SRR12721001.bam SRR12721002.bam SRR12721003.bam SRR12721004.bam
# 復(fù)雜命令(這里主要指>重定向符號)部分建議加上引號
# 每次運(yùn)行4條命令
parallel -j4 'samtools flagstat {} > {.}.stat' ::: *.bam
3.2 trim_galore
cat SraAccList.txt | while read id
do
echo $id
echo trim_galore -j 8 -q 25 --phred33 --length 36 \
-paired -o trim \
${id}_1.fastq.gz \
${id}_2.fastq.gz >> parellel.txt
done
# 每次運(yùn)行3條命令語句
parallel -j3 --verbose --progress :::: parellel.txt
參考鏈接:
http://www.itdecent.cn/p/cc54a72616a1
https://davetang.org/muse/2013/11/18/using-gnu-parallel/
https://www.biostars.org/p/63816/
https://www.gnu.org/software/parallel/parallel_tutorial.html