用于将numpy数组转换为共享内存数组的代码的pickle错误

时间:2013-04-30 15:17:39

标签: python numpy multiprocessing pickle

尝试使用此处的代码https://stackoverflow.com/a/15390953/378594将numpy数组转换为共享内存数组并返回。运行以下代码:

shared_array = shmarray.ndarray_to_shm(my_numpy_array)

然后将shared_array作为参数传递给多处理池的参数列表:

pool.map(my_function, list_of_args_arrays)

list_of_args_arrays包含我的共享数组和其他参数。

导致以下错误

PicklingError: Can't pickle <class 'multiprocessing.sharedctypes.c_double_Array_<array size>'>: attribute lookup multiprocessing.sharedctypes.c_double_Array_<array size> failed

<array_size>是我的numpy数组的线性大小。

我觉得numpy ctypes或类似的东西发生了什么变化?

进一步详情:

我只需要访问共享信息。这些流程不会进行任何编辑。

调用池的函数位于类中。启动该类,并由main.py文件调用该函数。

2 个答案:

答案 0 :(得分:1)

显然,当使用multiprocessing.Pool时,所有参数都被腌制,因此使用multiprocessing.Array没有用处。更改代码以便它使用一系列进程就可以了。但

答案 1 :(得分:0)

我认为你过于复杂化了: 不需要pickle数组(特别是如果它们是只读的):

你只需要通过一些全局变量来保持它们的可访问性:

(已知在linux下工作,但可能无法在Windows中运行,不知道)

import numpy as np,multiprocessing as mp
class si:
  arrs=None

def summer(i):
    return si.arrs[i].sum()

def main():
    si.arrs=[np.zeros(100) for _ in range(1000)]
    pool = mp.Pool(16)
    res=pool.map(summer,range(1000))
    print res

if __name__ == '__main__':
    main()

如果需要读取和写入数组,则需要使用: Is shared readonly data copied to different processes for Python multiprocessing?