我對于parallel并行的簡單理解即同時執(zhí)行多個命令語句。它與For循環(huán)語句的逐條運行的思路大相徑庭翼雀。盡管目前很多生信軟件支持多線程運行(一條命令語句內(nèi)),但并不是設(shè)置的越多就越快瓦呼,比如trim_galore命令建議對于一對fastq文件销斟,不超過8個線程庐椒。因此,如果想盡可能利用計算機幾十個線程的資源蚂踊,可以同時運行多個trim_galore约谈。誠然可以通過開啟多個終端命令,但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
僅打印而不運行命令語句
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)于大括號的使用
- 如上當傳遞多個參數(shù)時炬灭,使用{數(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
#如果只有一個參數(shù)靡菇,使用大括號即可指代該參數(shù)重归。如下,與上面命令等價
parallel echo cp {1} {1.}.test ::: ./*.txt
- 大括號的妙用
{} – full name 全名
{.} – one less file extension 以(最后一個)逗號為分隔符的前半部分
{/} – 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镰官、生信分析實例
- 由于生信軟件大部分也支持多線程運行提前,因此再同時執(zhí)行多條命令語句時吗货,有可能會超過計算機的最大線程數(shù)泳唠;
- 可以使用
-j
參數(shù),指定同時執(zhí)行的命令數(shù)宙搬; -
--verbose
參數(shù)可以在執(zhí)行命令語句前笨腥,先打印出該命令; -
--progress
參數(shù)可以實時顯示任務(wù)的完成進度
3.1 samtools flagstat
ls *bam
# SRR12720999.bam SRR12721000.bam SRR12721001.bam SRR12721002.bam SRR12721003.bam SRR12721004.bam
# 復雜命令(這里主要指>重定向符號)部分建議加上引號
# 每次運行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
# 每次運行3條命令語句
parallel -j3 --verbose --progress :::: parellel.txt
參考鏈接:
http://www.reibang.com/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