매우 큰 행렬의 열 쌍을 모두 조합하여 통계를 계산하려고합니다. 파이썬 스크립트는 jaccard.py
이라고 불리우며 한 쌍의 열을 받아들이고 행렬에 대해이 통계를 계산합니다.python2.4에서 하위 프로세스를 사용하는 병렬 처리
내 작업 컴퓨터에서 각 계산에는 약 10 초가 걸리고 완료하려면 약 95000 개의 계산이 필요합니다. 그러나 이러한 모든 계산은 서로 독립적이며 Torque 대기열 시스템과 python2.4를 사용하는 클러스터를 사용하려고합니다. Torque와 호환되도록이 계산을 병렬화하는 가장 좋은 방법은 무엇입니까?
나는 python2.4와 호환되는 계산 자체를 만들었지 만, subprocess
을 사용하여 이러한 계산을 병렬 처리하는 방법이나 GIL 때문에 그 작업을 수행 할 수 있는지 여부를 결정했습니다.
내가 가지고있는 주요 아이디어는 하위 프로세스의 지속적인 풀을 유지하는 것입니다. 하나가 끝나면 출력을 읽고 다음 열 쌍을 사용하여 출력을 읽습니다. 계산이 끝나면 출력 만 필요합니다. 그러면 새 계산에서 프로세스를 다시 시작할 수 있습니다. 최선이 작업을 수행하는 방법에
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
어떤 조언 :
내 생각은 작업에게 다음과 같은 주요 파이썬 파일을 호출 할이 방법
qsub -l nodes=4:ppn=8 myjob.sh > outfile
myjob.sh
를 제출했다 ? 저는 Torque를 전혀 사용해 본적이 없으며 서브 프로세스에 익숙하지 않습니다. 내 워크 스테이션에서 multiprocessing.Pool
을 사용해 보았는데 완벽하게 Pool.map
으로 작동했지만 클러스터가 python2.4를 사용하기 때문에 진행 방법을 잘 모르겠습니다.
EDIT : 실제로 두 번째 생각에, 나는 단지 95000 계산의 단일 덩어리에서만 작동하는 여러 개의 qsub 스크립트를 작성할 수 있습니다. 나는 1612 가지의 일자리를 제출할 수 있으며 각각은 7125 번의 계산을 수행한다. 그것은 본질적으로 같은 것입니다.