2013-08-01 4 views
0

매우 큰 행렬의 열 쌍을 모두 조합하여 통계를 계산하려고합니다. 파이썬 스크립트는 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 번의 계산을 수행한다. 그것은 본질적으로 같은 것입니다.

답변

1

실제로 두 번째 생각에, 나는 단지 95000 계산의 단일 덩어리에서만 작동하는 여러 개의 qsub 스크립트를 작성할 수 있습니다. 나는 1612 가지의 일자리를 제출할 수 있으며 각각은 7125 번의 계산을 수행한다. 그것은 본질적으로 같은 것입니다. 이것은 해결책이 아니지만 시간과 노력의 제약 조건을 고려할 때 적절한 해결 방법입니다.