Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将numpy数组转换为共享内存数组的代码出现Pickle错误_Python_Numpy_Multiprocessing_Pickle - Fatal编程技术网

Python 将numpy数组转换为共享内存数组的代码出现Pickle错误

Python 将numpy数组转换为共享内存数组的代码出现Pickle错误,python,numpy,multiprocessing,pickle,Python,Numpy,Multiprocessing,Pickle,尝试使用此处的代码将numpy数组转换为共享内存数组并返回。运行以下代码: shared_array=shmarray.ndarray_to_shm(my_numpy_array) 然后将共享_数组作为多处理池参数列表中的参数传递: pool.map(我的函数,参数数组列表) 其中参数列表\u数组包含我的共享数组和其他参数 它会导致以下错误 PicklingError:无法pickle:属性查找多处理.sharedTypes.c\u double\u数组失败 其中是我的numpy数组的线性大小

尝试使用此处的代码将numpy数组转换为共享内存数组并返回。运行以下代码:

shared_array=shmarray.ndarray_to_shm(my_numpy_array)

然后将共享_数组作为多处理池参数列表中的参数传递:

pool.map(我的函数,参数数组列表)

其中
参数列表\u数组
包含我的共享数组和其他参数

它会导致以下错误

PicklingError:无法pickle:属性查找多处理.sharedTypes.c\u double\u数组失败

其中
是我的numpy数组的线性大小

我猜numpy ctypes或类似的东西发生了变化

进一步详情: 我只需要访问共享信息。这些进程不会进行任何编辑


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

我认为您的操作过于复杂: 不需要对数组进行pickle(特别是在它们是只读的情况下):

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

(已知可在linux下工作,但可能无法在windows下工作,不知道)

如果需要读取和写入阵列,则需要使用以下方法:
我认为你把事情复杂化了: 不需要对数组进行pickle(特别是在它们是只读的情况下):

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

(已知可在linux下工作,但可能无法在windows下工作,不知道)

如果需要读取和写入阵列,则需要使用以下方法:

显然,当使用
多处理.Pool
时,所有参数都会被pickle,因此使用
多处理.Array
是没有用的。更改代码以使其使用一个进程数组就成功了。

显然,当使用
多处理.Pool
时,所有参数都会被pickle,因此使用
多处理.array
是没有用的。更改代码,使其使用一组进程就可以了。

这看起来不错。如果导入了文件,并且没有
文件,您可以添加它的外观吗。全局变量和函数
summer
在同一范围内的重要元素是什么?或者池和全局变量的定义?重要的是在mp.pool()之前初始化一个全局资源。例如,main()和‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘,但生成的进程的行为仍然像我根本没有更改全局变量一样-它们看到默认值(即
None
),尽管该值在主程序进程中确实发生了更改…请看这里。这似乎与您的示例相矛盾,我想如果您使用的是可能不起作用的窗口(它们的进程生成是不同的),但我从来没有windows尝试过。这看起来不错。如果导入了文件,并且没有
文件,您可以添加它的外观吗。全局变量和函数
summer
在同一范围内的重要元素是什么?或者池和全局变量的定义?重要的是在mp.pool()之前初始化一个全局资源。例如,main()和‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘,但生成的进程的行为仍然像我根本没有更改全局变量一样-它们看到默认值(即
None
),尽管该值在主程序进程中确实发生了更改…请看这里。这似乎与您的示例相矛盾,我想如果您使用的窗口可能不起作用(它们的生成过程是不同的),但我从未让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()