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