我对于parallel并行的简单理解即同时执行多个命令语句。它与For循环语句的逐条运行的思路大相径庭。尽管目前很多生信软件支持多线程运行(一条命令语句内),但并不是设置的越多就越快,比如trim_galore命令建议对于一对fastq文件,不超过8个线程。因此,如果想尽可能利用计算机几十个线程的资源,可以同时运行多个trim_galore。诚然可以通过开启多个终端命令,但parallel提供了更加便捷的并行方式。
1、conda安装
#使用conda安装可以避免root权限的限制
conda install -c conda-forge parallel
parallel --help
2、调用方法
- 常规命令语句 = 命令 + 参数
由于命令是固定的(trim_galore...),但参数是根据任务量而定的(many pairs fastq.gz files)
2.1 :::
传递参数
-
--dryrun
仅打印而不运行命令语句
echo A
echo B
echo C
parallel echo ::: A B C
2.2 ::::
将参数/命令储存到文件里,然后以文件名传递参数/命令
#传参数
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 传递多参数
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 关于大括号的使用
- 如上当传递多个参数时,使用{数字}形式可以灵活指定参数的位置
- 当参数为文件名(带路径)时,大括号的特殊用法可以实现巧妙组合
#组成字符串
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
#如果只有一个参数,使用大括号即可指代该参数。如下,与上面命令等价
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、生信分析实例
- 由于生信软件大部分也支持多线程运行,因此再同时执行多条命令语句时,有可能会超过计算机的最大线程数;
- 可以使用
-j
参数,指定同时执行的命令数; -
--verbose
参数可以在执行命令语句前,先打印出该命令; -
--progress
参数可以实时显示任务的完成进度
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
参考链接:
https://www.jianshu.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