我想计算一个非常大的矩阵列的所有成对组合的统计量。我有一个名为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次计算。这基本上是一回事。
答案 0 :(得分:1)
实际上,在第二个想法中,我可以编写多个qsub脚本,每个脚本只能处理95000个计算中的一个块。我可以提交16个不同的工作,每个工作进行7125次计算。这基本上是一回事。这不是一个解决方案,但考虑到时间和精力限制,这是一个合适的解决方法。