2

通过阅读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 的东西会起作用。

4

0 回答 0