在数据文件的文件夹上运行4个python脚本的并发实例

时间:2012-01-23 07:30:03

标签: python multithreading bash xargs

我们有一个包含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的回答。再次感谢!

4 个答案:

答案 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个作业:

Simple scheduling

GNU Parallel会在完成后生成一个新进程 - 保持CPU处于活动状态,从而节省时间:

GNU Parallel scheduling

<强>安装

如果没有为您的发行版打包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