我想使用multiprocessing
模块从子进程访问现有的NumPy数组,而不将数组复制到共享内存对象。显然,multiprocessing.Array
创建了这样一个共享内存数组,但我似乎无法将数组指向现有的numpy.ndarray
对象。这很关键,因为现有阵列可能非常大(最多几GB),所以我绝对需要避免任何复制操作。
这是我迄今为止所做的尝试:
import multiprocessing as mp
import numpy as np
def f(x, idx):
"""Dummy function to manipulate an array."""
x[idx] = 999
a = np.array([1.2, 15.8, 10.3, 7.4, -44.9])
b = mp.Array("d", a) # apparently this creates a copy of a in b
print("Original array:".rjust(28, " "), a)
f(a, 0)
print("Change a[0] in main process:".rjust(28, " "), a)
p = mp.Pool(1)
p.apply_async(f, args=(b, 4))
print("Change b[4] in subprocess:".rjust(28, " "), np.frombuffer(b.get_obj()))
理想情况下,我希望a
和b
引用相同的基础数字,但显然这不起作用。有趣的是,b
也不会改变p.apply_async(f, args=(b, 4))
- 这可能与原始问题无关,但我仍然想了解原因。