在python2.4中使用子进程进行并行处理
我想计算一个非常大的矩阵中所有列的成对组合的统计量。我有一个python脚本,名为在python2.4中使用子进程进行并行处理,python,subprocess,python-2.4,qsub,torque,Python,Subprocess,Python 2.4,Qsub,Torque,我想计算一个非常大的矩阵中所有列的成对组合的统计量。我有一个python脚本,名为jaccard.py,它接受一对列并在矩阵上计算这个统计数据 在我的工作机器上,每次计算大约需要10秒,我要完成大约95000次计算。然而,所有这些计算都是相互独立的,我希望使用一个集群,它使用了Torque排队系统和python2.4并行计算使其与扭矩兼容的最佳方法是什么? 我已经使计算本身与python2.4兼容,但是我不知道如何使用子进程并行这些计算,或者是否因为GIL而可以这样做 我的主要想法是保持子进程池
jaccard.py
,它接受一对列并在矩阵上计算这个统计数据
在我的工作机器上,每次计算大约需要10秒,我要完成大约95000次计算。然而,所有这些计算都是相互独立的,我希望使用一个集群,它使用了Torque排队系统和python2.4并行计算使其与扭矩兼容的最佳方法是什么?
我已经使计算本身与python2.4兼容,但是我不知道如何使用子进程
并行这些计算,或者是否因为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次计算。本质上是一样的。事实上,经过仔细考虑,我可以编写多个qsub脚本,每个脚本只处理95000个计算中的一个块。我可以提交16份不同的工作,每个工作做7125次计算。本质上是一样的。这不是一个解决方案,但考虑到时间和精力的限制,它是一个合适的解决方案