通过阅读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
不可写的错误(assignment destination is read-only)。
我面临的问题是我有非常大的 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 而不是 multiprocessing 的东西会起作用。