我们有一个包含50个数据文件(下一代DNA序列)的文件夹,需要通过在每个文件上运行python脚本进行转换。该脚本每个文件需要5个小时,它是单线程的,并且主要受CPU限制(CPU核心运行率为99%,磁盘IO最小)。
由于我有一台4核机器,我想一次运行这个脚本的4个实例,以大大加快这个过程。
我想我可以将数据分成4个文件夹并同时在每个文件夹上运行以下bash脚本:
files=`ls -1 *`
for $file in $files;
do
out = $file+=".out"
python fastq_groom.py $file $out
done
但必须有更好的方法在一个文件夹上运行它。我们可以使用Bash / Python / Perl / Windows来做到这一点 (遗憾的是,使脚本多线程超出了我们的能力范围)
使用@phs xargs解决方案是我们解决问题的最简单方法。然而,我们要求原始开发人员实现@Björn的回答。再次感谢!
答案 0 :(得分:7)
您可以使用multiprocessing
- 模块。我想你有一个要处理的文件列表和一个为每个文件调用的函数。然后你可以简单地使用这样的工作池:
from multiprocessing import Pool, cpu_count
pool = Pool(processes=cpu_count)
pool.map(process_function, file_list, chunksize=1)
如果process_function
没有返回值,则可以忽略返回值。
答案 1 :(得分:1)
看看xargs
。它的-P
选项提供了可配置的并行度。具体来说,这样的事情对你有用:
ls files* | awk '{print $1,$1".out"}' | xargs -P 4 -n 2 python fastq_groom.py
答案 2 :(得分:1)
试一试:
#!/bin/bash
files=( * )
for((i=0;i<${#files[@]};i+=4)); do
{
python fastq_groom.py "${files[$i]}" "${files[$i]}".out &
python fastq_groom.py "${files[$i+1]}" "${files[$i+1]}".out &
python fastq_groom.py "${files[$i+2]}" "${files[$i+2]}".out &
python fastq_groom.py "${files[$i+3]}" "${files[$i+3]}".out &
}
done
以下内容将所有文件放入名为files
的数组中。然后它在前四个文件上执行并构建四个python进程。只要这些进程的所有四个完成,它就会执行接下来的四个进程。它没有像保持4队列一样有效,但如果所有进程花费大约相同的时间,它应该非常接近。
此外,请不要使用ls
的输出。只需使用for files in *.txt; do ...; done
答案 3 :(得分:0)
如果你有GNU Parallel,你可以这样做:
parallel python fastq_groom.py {} {}.out ::: files*
它会通过为每个核心生成一个作业来做正确的事情,即使你的文件的名称中有空格,'或'。它还确保不同作业的输出不会混合在一起,所以如果你使用输出,保证你不会从两个不同的工作中获得半个线。
GNU Parallel是一个通用的并行程序,可以很容易地在同一台机器上或在你有ssh访问权限的多台机器上并行运行作业。
如果要在4个CPU上运行32个不同的作业,并行化的直接方法是在每个CPU上运行8个作业:
GNU Parallel会在完成后生成一个新进程 - 保持CPU处于活动状态,从而节省时间:
<强>安装强>
如果没有为您的发行版打包GNU Parallel,您可以进行个人安装,不需要root访问权限。这可以在10秒内完成:
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
有关其他安装选项,请参阅http://git.savannah.gnu.org/cgit/parallel.git/tree/README
了解详情
查看更多示例:http://www.gnu.org/software/parallel/man.html
观看介绍视频:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
完成教程:http://www.gnu.org/software/parallel/parallel_tutorial.html
注册电子邮件列表以获得支持:https://lists.gnu.org/mailman/listinfo/parallel