IPython Parallel のドキュメントを読むと、バッファがコア間でコピーされることがわかります。ただし、使用するtrack = True
ことで、バッファーをその場で編集できると書かれています。
次の例は、次の場合でも機能しませんtrack = True
。
import numpy as np
from IPython.parallel import Client
A = np.zeros((10,10), int)
rc = Client()
dview = rc[:]
def ptest(a):
a[0] = 5
dview.track = True
r = dview.map_sync(ptest, A)
r.wait_for_send()
a
書き込み可能ではないというエラーが表示され続けます(割り当て先は読み取り専用です)。
私が直面している問題は、非常に大きな 3D マトリックスがあり、その場で変更したいということです。私のアイデアは、 のmap
ようなアプローチを使用して、個々の 2D スライスをクラスターに送信し、その場で変更することでした。
IPython Parallel でこれを達成する方法はありますか? それとも、書き込み可能なバッファを送信することは事実上不可能で、唯一の方法はコピーされたバッファから結果を収集することですか?
これが不可能な場合、IPython Notebook で非同期にコアから結果を取得し、コールバック関数で更新する方法はありますか? これは、問題ないものの疑似コードです。IPython Parallel で利用できるこのようなものはありますか?:
def edit(a):
a[0] = 5
return a
def callback(i, a):
A[i] = a
r = dview.map_async(edit, A, callback)
r.wait()
上記のコードのアイデアは、(現在のマシンの) 出力バッファーのrows
を非同期に更新するコールバックと並行して、マトリックスから変更された値を返す関数を用意することです。rows
つまり、マルチプロセッシングの代わりに IPython Parallel を使用すると、このようなものが機能します。