2017-04-15 10 views
0

다중 처리를 사용하여 다음 스크립트에서 data1 배열을 채 웁니다. 지금은 스크립트가 제대로 실행되지만 배열이 채워지지 않습니다. this을 구현하려고했지만 두 개의 iterables를 사용하기 때문에 작동하지 못했습니다. 도움말 감사; 감사! 그건 그렇고, 나는 최신 MacOS에서 jupyter 노트북을 사용합니다.다중 처리로 3D 배열 채우기

import numpy as np 
import multiprocessing as mp 
from itertools import product 

#Generate random data: 
data = np.random.randn(12,20,20) 

#Create empty array to store the result 
data1 = np.zeros((data.shape), dtype=np.float) 

#Define the function 
def fn(parameters): 
    i = parameters[0] 
    j = parameters[1] 
    data1[:,i,j] = data[:,i,j] 

#Generate processes equal to the number of cores 
pool = mp.Pool(processes=4) 

# Generate values for each parameter: i.e. i and j 
i = range(data.shape[1]) 
j = range(data.shape[2]) 

#generate a list of all combinations of the parameters 
paramlist = list(product(i,j)) 

#call the function and multiprocessing 
np.array(pool.map(fn,paramlist)) 
pool.close() 
+0

코드에서 "제품"기능은 무엇입니까? 마주 치게되는 정확한 문제는 무엇입니까? – mommermi

+0

@mommermi '제품'은 'itertools'에서 가져온 것입니다. 문제는 data1 배열이 함수를 호출 한 후에 채워지지 않는다는 것입니다. 이를 분명히하기 위해 원래 게시물을 수정했습니다. 감사! – hrishi

답변

1

Pool.map은 작업자 프로세스를 사용하여 주어진 데이터에 기능을 적용합니다. 그런 다음 함수에서 반환 데이터를 수집하여이를 부모에게 전송합니다.

함수가 아무 것도 반환하지 않으므로 결과가 없습니다.

각 작업자의 로컬 복사본data1 인 경우 변경됩니다. :-)

수정할 데이터가 많으면 작업자 프로세스와 부모간에 데이터를 이동하는 오버 헤드로 인해 multiprocessing이 좋은 해결책이되지 못하는 경우가 많습니다.

먼저 단일 프로세스를 사용해보십시오.

+0

아, 고마워. 이 스크립트는 반환 값을 할당 한 후에 잘 작동하며 직렬 구현에 비해 ~ 2 배 빠릅니다. 내 랩톱은 듀얼 코어이지만 다중 처리 .cpu_count()를 사용하면 4를 답으로 얻습니다. 성능을 향상시킬 여지가 더 많습니까? 다중 처리보다 다른 솔루션을 추천 하시겠습니까? – hrishi

+0

기본적으로'multiprocessing'은'cpu_count' 보고서만큼 프로세스를 생성합니다. 실제 CPU의 두 비트 'cpu_count'가 4를보고 있다면, CPU에 [하이퍼 스레딩] (https://en.wikipedia.org/wiki/Hyper-threading)이있는 것일 수 있습니다. hyprtreading이 실제로 얼마나 성능을 향상시키는 지 확신 할 수 없습니다. 단지 두 개의 물리적 CPU 만 있습니다. 이것이 이것이 당신이 단지 두 배 빨리 달리는 것을 보는 이유 일 수 있습니다. –

관련 문제