2017-04-15 6 views
0

次のスクリプトからdata1配列をマルチプロセッシングで埋めたいと思います。今のところ、スクリプトはうまく動作しますが、配列はいっぱいになりません。私はthisを実装しようとしましたが、2つのiterablesを使用しているため、動作できませんでした。ヘルプは高く評価しました。ありがとう! ところで、私は最新のMacOSでジュピターノートを使用しています。マルチプロセッシングによる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は良い解決策ではないことがよくあります。

最初に1つのプロセスを試してみてください。

+0

ああ、ありがとう、ありがとう。このスクリプトは戻り値を割り当てた後にうまく動作し、シリアル実装に比べて2倍高速です。私のラップトップはデュアルコアですが、multiprocessing.cpu_count()を使用すると、答えとして4が得られます。だからパフォーマンスを改善する余地があるかもしれません?マルチプロセッシング以外のソリューションをお勧めしますか? – hrishi

+0

デフォルトでは、 'multiprocessing'は' cpu_count'レポートと同じ数のプロセスを作成します。 2つの物理CPUのビット 'cpu_count'が4つ報告されている場合は、CPUに[ハイパースレッディング](https://en.wikipedia.org/wiki/Hyper-threading)がある可能性があります。 hyprtreadingが実際にパフォーマンスをどれだけ増やしているかは分かりません。物理CPUはまだ2つしかありません。これが、あなたがそれが2倍速く走っているのを見るだけの理由かもしれません。 –

関連する問題