2017-09-12 11 views
0

필자가 작성한 코드의 속도를 높이기 위해 파이썬 다중 처리를 시도하고 있습니다. 코드는 다음과 같습니다다중 처리에서 공유 배열을 사용하여 값 저장

from multiprocessing import Array, Pool 
import numpy as np 
#setting up shared memory array 
global misfit 
misfit = Array('d', np.empty((dim1,dim2,dim3,dim4)).flat) 

#looping through some values 
for i in xrange(0,1): 
    #setting up pool 
    pool = Pool() 
    p = [pool.apply_async(self.testfunc,args=(somevals,j)) for j in xrange(0,1)] 
    pool.close() 
    pool.join() 
self.testfunc의 모습

:

def testfunc(self,somevals,j): 
     #some calculations 
     for k in xrange(0,1): 
      #some calculations 
      for mn in xrange(0,1): 
       #some more calculations 
       #save results 
       result = i*j*k*mn # example 
       misfit[i*j*k*mn] = result 

내 문제는 내가 공유 배열에 저장된 값이 전혀 실행하지 않으며, 때 비어 있다는 것입니다 . 나는 이것이 전역 변수와 관련이있을 수 있다는 것을 알고 있지만,이 정확한 설정을 사용하는보다 단순한 프로그램에서는 값이 배열에 저장됩니다. 배열은 전체 프로그램에서도 상당히 큽니다 (4561920000 값). 또한이 함수를 풀 외부에서 호출하면 작동하고 값이 저장됩니다.

내 질문에 내가 여기서 잘못하고있는 것입니까? 공유 배열을 잘못 보내고 있습니까?

편집 : 작동 코드를 추가 거라고 생각 :

from multiprocessing import Array, Pool 
from numpy import empty, sin 
from time import time 
import numpy as np 

def initarr(): 
    a = Array('d', empty((5, 50, 80)).flat) 
    return a 

def testfunc(i, j, k): 
    count = (i*50*80) + (j*80) + k 
    x = sin(k) 
    a[count] = x 
    y = np.fft.fft(np.exp(2j*np.pi*np.arange(50000)/50000)) 


def process(i): 
    start = time() 
    pool = Pool() 
    for j in xrange(0, 50): 
    p = [pool.apply_async(testfunc, args=(i, j, k)) for k in xrange(0, 80)] 
    pool.close() 
    pool.join() 
    print time() - start 


global a 
a = initarr() 

for i in xrange(0, 5): 
    process(i) 

답변

0

좋아, 나는 마침내 사람을 위해, 그래서 작품을이 버전을 가지고 우리의 IT 부서에서 누군가의 도움 있도록 이 질문을 보는 미래, 나는 해결책을 게시 할 것이다. 스택 오버플로를 실제로 사용하지 않은 것은 유감스럽게도 내 자신의 질문에 답하는 것이 좋지 않은 경우입니다.

이니셜 라이저 기능을 사용하여 작업 할 수 있지만 이니셜 라이저 기능이 동일한 파일 (모듈) 에 있는지 확인해야합니다.이 파일은 풀에서 실행되는 기능으로입니다. 따라서 하나 개의 모듈 (기타) 우리는 있었다 :

**misc.py** 
def testfunc(self,somevals,j): 
    #some calculations 
    for k in xrange(0,len(krange)): 
     #some calculations 
     for mn in xrange(0,len(mnrange)): 
      #some more calculations 
      #save results 
      loc = (i*len(jrange)*len(krange)*len(mnrange))+ 
        (j*len(krange)*len(mnrange))+(k*len(mnrange))+mn 
      result = i*j*k*mn # example 
      misfit[loc] = result 

def initpool(a): 
    global misfit 
    misfit = a 

그리고 주요 파일에 우리는이 :

**main.py** 
from multiprocessing import Array, Pool 
from misc import initpool, testfunc 
import numpy as np 

#setting up shared memory array 
misfit = Array('d', np.empty((dim1,dim2,dim3,dim4)).flat) 

#looping through some values 
for i in xrange(0,len(irange)): 
    #setting up pool 
    pool = Pool(initializer=initpool,initargs=(misfit,),processes=20) 
    p = [pool.apply_async(testfunc,args=(somevals,j)) for j in xrange(0,len(jrange))] 
    pool.close() 
    pool.join() 

print(misfit[0]) 

주 우리가 처음 배열을 설정 즉, 그것이 를 지정해야합니다 같은을 initpool에서 설정 한 변수로 사용하십시오. 적어도 테스트 할 때부터 사용하십시오.

이것은 아마도 최선의 방법은 아니지만 작동하고 잘하면 다른 사람들이 그것을 사용할 수 있습니다!