我有一堆文件,想要使用Python的多进程读取并将所有数据收集到单个NumPy数组中。为此,我想定义一个共享内存NumPy数组,并将其切片传递给不同的进程以并行读取。下面的代码是我尝试使用多进程修改numpy数组的玩具示例。
示例1:
在这段代码中,我希望数组arr被填充为0、1、2、3。然而,输出结果显示arr全是0。在阅读了这里的答案后,我使用了multiprocessing.Array来定义共享内存变量,并修改了我的代码如下:
例子二:
这也会在 arr 中打印所有的零。然而,当我在 main 之外定义数组并使用 pool.map 时,代码可以正常工作。例如,下面的代码可以正常工作。
示例 3:
这将打印出 [0,1,2,3]。
我对所有这些感到非常困惑。我的问题是:
1. 当我定义 arr = np.zeros(4) 时,哪个处理器拥有这个变量?当我将这个数组的切片发送到不同的处理器时,如果这个变量在那些处理器上没有定义,会发送什么?
2. 为什么示例2不起作用,而示例3起作用?
我正在使用Linux和Python/3.7/4。
示例1:
import numpy as np
import multiprocessing
def do_stuff(i, arr):
arr[:]=i
return
def print_error(err):
print(err)
if __name__ == '__main__':
idx = [0,1,2,3]
# Need to fill this array in parallel
arr = np.zeros(4)
p = multiprocessing.Pool(4)
# Passing slices to arr to modify using multiprocessing
for i in idx:
p.apply(do_stuff, args=(i,arr[i:i+1]))
p.close()
p.join()
print(arr)
在这段代码中,我希望数组arr被填充为0、1、2、3。然而,输出结果显示arr全是0。在阅读了这里的答案后,我使用了multiprocessing.Array来定义共享内存变量,并修改了我的代码如下:
例子二:
import numpy as np
import multiprocessing
def do_stuff(i, arr):
arr[:]=i
return
def print_error(err):
print(err)
if __name__ == '__main__':
idx = [0,1,2,3]
p = multiprocessing.Pool(4)
# Shared memory Array
shared = multiprocessing.Array('d', 4)
arr = np.ctypeslib.as_array(shared.get_obj())
for i in idx:
p.apply(do_stuff, args=(i,arr[i:i+1]))
p.close()
p.join()
print(arr)
这也会在 arr 中打印所有的零。然而,当我在 main 之外定义数组并使用 pool.map 时,代码可以正常工作。例如,下面的代码可以正常工作。
示例 3:
import numpy as np
import multiprocessing
shared = multiprocessing.Array('d', 4)
arr = np.ctypeslib.as_array(shared.get_obj())
def do_stuff(i):
arr[i]=i
return
def print_error(err):
print(err)
if __name__ == '__main__':
idx = [0,1,2,3]
p = multiprocessing.Pool(4)
shared = multiprocessing.Array('d', 4)
p.map(do_stuff, idx)
p.close()
p.join()
print(arr)
这将打印出 [0,1,2,3]。
我对所有这些感到非常困惑。我的问题是:
1. 当我定义 arr = np.zeros(4) 时,哪个处理器拥有这个变量?当我将这个数组的切片发送到不同的处理器时,如果这个变量在那些处理器上没有定义,会发送什么?
2. 为什么示例2不起作用,而示例3起作用?
我正在使用Linux和Python/3.7/4。
do_stuff
函数的本地范围内,参数会覆盖全局作用域中的arr
,因此arr
在全局作用域中是什么并不重要。如果省略传递arr
,它将不会被覆盖,您将获得全局版本。我有点忽略了这一点,可能应该在我的答案中提到它... - Aaron