Python 多处理-使用管理器命名空间来节省内存

Python 多处理-使用管理器命名空间来节省内存,python,numpy,memory,out-of-memory,python-multiprocessing,Python,Numpy,Memory,Out Of Memory,Python Multiprocessing,我有几个进程,每个进程都需要一个大的numpy数组来完成任务,这只是在读取(线程正在搜索合适的值) 如果每个进程加载数据,我会收到一个内存错误 因此,我试图通过使用管理器在进程之间共享同一阵列来最小化内存使用 但是,我仍然收到一个内存错误。我可以在主进程中加载数组一次,但是,当我尝试将其作为管理器命名空间的属性时,我会收到一个内存错误。我假设管理器就像指针一样,允许单独的进程(通常只访问自己的内存)也访问这个共享内存。但是,错误提到了酸洗: 回溯(最近一次呼叫最后一次): 文件,第63行,在 n

我有几个进程,每个进程都需要一个大的numpy数组来完成任务,这只是在读取(线程正在搜索合适的值)

如果每个进程加载数据,我会收到一个内存错误

因此,我试图通过使用管理器在进程之间共享同一阵列来最小化内存使用

但是,我仍然收到一个内存错误。我可以在主进程中加载数组一次,但是,当我尝试将其作为管理器命名空间的属性时,我会收到一个内存错误。我假设管理器就像指针一样,允许单独的进程(通常只访问自己的内存)也访问这个共享内存。但是,错误提到了酸洗:

回溯(最近一次呼叫最后一次):
文件,第63行,在
ns.pp=某物
文件“C:\Program Files(x86)\Python35-32\lib\multiprocessing\managers.py”,第1021行,位于\uuu setattr__
返回callmethod(“设置属性”(键,值))
文件“C:\Program Files(x86)\Python35-32\lib\multiprocessing\managers.py”,第716行,在调用方法中
conn.send((self.\u id,methodname,args,kwds))
文件“C:\Program Files(x86)\Python35-32\lib\multiprocessing\connection.py”,第206行,发送
self.\u发送字节(ForkingPickler.dumps(obj))
文件“C:\Program Files(x86)\Python35-32\lib\multiprocessing\reduce.py”,第50行,转储
cls(buf,协议).dump(obj)
记忆者
我假设在分配给管理器时numpy数组实际上正在被复制,但我可能错了

让事情变得更烦人一点的是,我在一台32GB内存的机器上,看着内存使用情况,它在崩溃前只会增加一点,最多可能增加5%-10%

有人能解释一下为什么将数组作为名称空间的属性会占用更多的内存吗?
为什么我的程序不会使用一些可用的空闲内存?(我已经阅读了和文档以及这些和线程等等)

我正在运行Windows Server 2012 R2和Python 3.5.2 32位

下面是一些演示我的问题的代码(您需要使用另一个文件来替代
large.txt
,该文件大约有75MB的制表符分隔字符串):


管理器类型是为灵活性而不是效率而构建的。它们创建一个保存值的服务器进程,并可以将代理对象返回到每个进程中。服务器和代理通过tls进行通信,以允许服务器和代理位于不同的机器上,但这必然意味着复制任何有问题的对象。我有en没有一路追踪来源,因此额外的副本可能在使用后被垃圾收集,但至少最初必须有一个副本


如果您想要共享物理内存,我建议使用。它们实际上指向内存中的一个公共位置,因此速度更快,资源也更少。它们不支持全脂python对象所做的所有事情,但可以通过创建来扩展它们来组织数据。

您建议使用
结构,但是否使用ctypes阵列也很合适?什么是tls?除了文档之外,还有什么具体的信息来源我可以阅读以了解更多信息吗?@Harrydeventon the将永远不会说谎。tls是。它是一种通过套接字进行通信的通信协议(可以是进程间通信,也可以通过以太网等物理层转发)@Harrydwinton看一看本节末尾的示例。它展示了如何使用
ctypes.Structure
多处理.sharedTypes.Array
命名值,从而使处理数字变得更简单(而不仅仅是记住数组偏移量)实际上,管理器非常酷,允许您使用任何可以安装python的计算机设置计算集群。如果您坚持使用一台物理计算机(以及一个父进程),我会坚持使用实际共享内存。请参阅。
import multiprocessing
import numpy as np

if __name__ == '__main__':

    # load Price Paid Data and assign to manager
    mgr = multiprocessing.Manager()
    ns = mgr.Namespace()

    ns.data = np.genfromtxt('large.txt')
    # Alternative proving this work for smaller objects
    # ns.data = 'Test PP data'