卖萌哥
2022/11/07阅读:62主题:橙心
用ParaFly并行任务,给你的分析提提速!
背景介绍
大家在做日常生信分析的时候经常会遇到有多个任务要进行相同的操作的时候。
比如需要下载100个测序数据,比如下载了数据之后想要批量地生成FastQC报告等等操作。
一般这种时候我们的选择可能是写一个循环来完成,比如:
for i in {01..99}
do
wget -c ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR908/ERR908503/ERR9085${i}_1.fastq.gz
wget -c ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR908/ERR908503/ERR9085${i}_2.fastq.gz
done
又或者生成FastQC报告:
for i in `ls ./*gz`
do
fastqc -t 20 -o fastqc/ ./*gz
done
【命令都是我手搓的,如果执行不了意会一下就好:)】
这时候就有一个问题,任务是串联运行的。它必须得前一个完成之后才能进行下一个。
这个过程占用的时间会比较长,特别是运行一些不支持多核运行的命令的时候,一大堆核心眼睁睁看着一个核在那干活儿,就会很糟心。

于是可能就会有另一种极端:我把所有的任务都并行去跑不就比较快啦~例如
for i in {01..99}
do
wget -c ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR908/ERR908503/ERR9085${i}_1.fastq.gz &
wget -c ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR908/ERR908503/ERR9085${i}_2.fastq.gz &
done
【跟第一个代码块的区别只在末尾多一个&
符号,这是提交后台的意思】
但是这样操作就会面临另一个问题,特别是当你使用的是共享的服务器的时候: 你可能会把所有的核心都占满,被管理员警告然后kill掉任务。
那么,如何才能简单地随心所欲地控制并行使用的线程数呢?
用ParaFly给你的分析提提速
给大家推荐一个工具叫ParaFly。用conda就能安装
conda install parafly
而它的使用也非常简单,就俩参数:
-c <str> :filename containing list of bash-style commands to execute.
-CPU <int> :number_of_threads
一个是-c
,用于指定包含待运行命令的文件,一行放一个命令; 另一个-CPU
则是指定同时运行多少个命令。
比如把之前的命令改造一下。
这次不是直接运行命令,而是在原来的命令前加上echo并把命令用双引号括起来,重定向到cmd.txt
文件里:
for i in {01..99}
do
echo "wget -c ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR908/ERR908503/ERR9085${i}_1.fastq.gz" \
>> cmd.txt
echo "wget -c ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR908/ERR908503/ERR9085${i}_2.fastq.gz" \
>> cmd.txt
done
就会得到这样的一个配置文件cmd.txt
:
wget -c ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR908/ERR908503/ERR908501_1.fastq.gz
wget -c ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR908/ERR908503/ERR908501_2.fastq.gz
wget -c ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR908/ERR908503/ERR908502_1.fastq.gz
wget -c ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR908/ERR908503/ERR908502_2.fastq.gz
......
wget -c ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR908/ERR908503/ERR908599_1.fastq.gz
wget -c ftp://ftp.sra.ebi.ac.uk/vol1/fastq/ERR908/ERR908503/ERR908599_2.fastq.gz
接下来就用ParaFly来运行
ParaFly -c cmd.txt -CPU 10
接下来这些任务就会以10个一组进行啦。
提前答疑
提问:如果我运行的任务本身就支持多线程,最后会用几个线程?
会是-CPU指定的线程数
乘以你命令里指定的线程数
比如上面的fastqc,我每个任务指定的-t
是10
,ParaFly指定的-CPU
是4
,那么就会同时占用40
个CPU运行你的任务。
如果你有别的问题,欢迎在下面留言哦,我看到会一一答复你们的~
萌哥碎碎念
又断更了一段时间,读博的压力还是有的,总有干不完的活儿和de不完的bug。好在整个科研和生活环境还是很不错的,老板也很nice,吃的苦都是科研的苦和日常生活的苦,没有其他奇怪的苦。以后争取周更。
作者介绍