IPython Parallel изменяет пустые строки на месте
Читая документацию к 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
недоступно для записи (назначение назначения доступнотолько для чтения).
Проблема, с которой я сталкиваюсь, заключается в том, что у меня очень большие трехмерные матрицы, и я хотел бы изменить их на месте. Моя идея состояла в том, чтобы использовать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 вместо многопроцессорной обработки будет работать.