0

非常に大きな行列の列のすべてのペアごとの組み合わせについて統計を計算したいと考えています。jaccard.py私は、列のペアを受け入れ、行列に対してこの統計を計算すると呼ばれる Python スクリプトを持っています。

私の作業用マシンでは、各計算に約 10 秒かかり、約 95,000 回の計算を完了する必要があります。ただし、これらの計算はすべて互いに独立しているため、Torque キューイング システムと python2.4 を使用するクラスターを使用したいと考えています。Torque と互換性があるように、この計算を並列化する最良の方法は何ですか?

subprocess計算自体は 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 を使用しているため、続行する方法がわかりません。

EDIT : 実際には、考え直して、複数の qsub スクリプトを記述し、それぞれが 95000 の計算の 1 つのチャンクのみで動作するようにすることができました。それぞれ 7125 回の計算を行う 16 の異なるジョブのようなものを送信できます。それは本質的に同じことです。

4

1 に答える 1