2017-04-15 60 views
0

我希望通過多處理從以下腳本填充data1數組。現在,腳本運行正常,但數組未被填充。我嘗試了執行this,但由於使用了兩個迭代器,我無法使其工作。幫助讚賞;謝謝!順便說一下,我在最新的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

代碼中的''product''函數是什麼?你遇到的確切問題是什麼? – mommermi

+0

@mommermi'產品'來自'itertools'。問題是data1數組在調用函數後仍未填充。對原始帖子進行了編輯以澄清此問題。謝謝! – hrishi

回答

1

Pool.map所做的是將函數應用於使用工作進程的給定數據。然後它收集來自函數的返回數據並將其傳輸給父項。

由於你的函數沒有返回任何東西,你不會得到任何結果。

會發生什麼情況是在每個工人本地副本data1被修改。 :-)

當你有大量的數據需要修改時,multiprocessing往往不是一個好的解決方案,因爲在工作進程和父進程之間移動數據的開銷。

首先嚐試使用單個進程。

+0

啊,我明白了,謝謝。該腳本在分配返回值後運行良好,與串行實現相比,速度快了兩倍。我的筆記本電腦是雙核心的,但是使用multiprocessing.cpu_count(),我得到了4個答案。那麼可能會有更多改善性能的空間?你會推薦除了多處理之外的其他解決方案嗎? – hrishi

+0

默認情況下,'multiprocessing'創建與'cpu_count'報告一樣多的進程。如果你有兩個物理CPU'cpu_count'報告4,那麼你的CPU可能[超線程](https://en.wikipedia.org/wiki/Hyper-threading)。我不確定究竟有多少低通會提高性能:仍然只有兩個物理CPU。這可能是因爲你只看到它運行速度快兩倍。 –