Python 将numpy数组转换为共享内存数组的代码出现Pickle错误
尝试使用此处的代码将numpy数组转换为共享内存数组并返回。运行以下代码: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数组的线性大小
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()