在python2.4中使用子进程进行并行处理

时间:2013-08-01 21:43:16

标签: python subprocess python-2.4 qsub torque

我想计算一个非常大的矩阵列的所有成对组合的统计量。我有一个名为jaccard.py的python脚本,它接受一对列并在矩阵上计算这个统计量。

在我的工作机器上,每次计算大约需要10秒钟,我完成了大约95000次这些计算。但是,所有这些计算都是相互独立的,我希望使用一个使用Torque排队系统和python2.4的集群。 将此计算并行化的最佳方法是什么,以便与Torque兼容?

我已经使计算本身与python2.4兼容,但我不知道如何使用subprocess并行化这些计算,或者我是否可以因为GIL而这样做。

我的主要想法是保持一个恒定的子流程池;当一个完成时,读取输出并使用下一对列开始一个新输出。计算完成后我只需要输出,然后可以在新计算中重新启动该过程。

我的想法是以这种方式提交工作

qsub -l nodes=4:ppn=8 myjob.sh > outfile

myjob.sh将调用一个类似于以下内容的主python文件:

import os, sys
from subprocess import Popen, PIPE
from select import select

def combinations(iterable, r):
    #backport of itertools combinations
    pass

col_pairs = combinations(range(598, 2))

processes = [Popen(['./jaccard.py'] + map(str, col_pairs.next()), 
                   stdout=PIPE)
             for _ in range(8)]

try:
    while 1:
        for p in processes:
            # If process has completed the calculation, print it out
            # **How do I do this part?**

            # Delete the process and add a new one
            p.stdout.close()
            processes.remove(p)
            process.append(Popen(['./jaccard.py'] + map(str, col_pairs.next()),
                                 stdout=Pipe))

# When there are no more column pairs, end the job.
except StopIteration:
    pass

关于如何做到这一点的任何建议?我从未使用过Torque,并且不熟悉这种方式的子处理。我尝试在我的工作站上使用multiprocessing.Pool,它与Pool.map完美配合,但由于群集使用python2.4,我不知道如何继续。

编辑:实际上,第二个想法,我可以编写多个qsub脚本,每个脚本只能处理95000个计算中的一个块。我可以提交16个不同的工作,每个工作进行7125次计算。这基本上是一回事。

1 个答案:

答案 0 :(得分:1)

实际上,在第二个想法中,我可以编写多个qsub脚本,每个脚本只能处理95000个计算中的一个块。我可以提交16个不同的工作,每个工作进行7125次计算。这基本上是一回事。这不是一个解决方案,但考虑到时间和精力限制,这是一个合适的解决方法。