【发布时间】:2018-01-20 00:18:48
【问题描述】:
我有几个进程,每个进程都完成需要单个大型 numpy 数组的任务,这只是被读取(线程正在搜索它以寻找合适的值)。
如果每个进程都加载数据,我会收到内存错误。
因此,我试图通过使用管理器在进程之间共享相同的数组来最小化内存使用量。
但是我仍然收到内存错误。我可以在主进程中加载数组一次,但是当我尝试将其设置为管理器命名空间的 属性时,我收到 内存错误 .我假设管理器的行为类似于指针,并允许单独的进程(通常只能访问自己的内存)也可以访问此共享内存。但是错误提到了酸洗:
Traceback (most recent call last):
File <PATH>, line 63, in <module>
ns.pp = something
File "C:\Program Files (x86)\Python35-32\lib\multiprocessing\managers.py", line 1021, in __setattr__
return callmethod('__setattr__', (key, value))
File "C:\Program Files (x86)\Python35-32\lib\multiprocessing\managers.py", line 716, in _callmethod
conn.send((self._id, methodname, args, kwds))
File "C:\Program Files (x86)\Python35-32\lib\multiprocessing\connection.py", line 206, in send
self._send_bytes(ForkingPickler.dumps(obj))
File "C:\Program Files (x86)\Python35-32\lib\multiprocessing\reduction.py", line 50, in dumps
cls(buf, protocol).dump(obj)
MemoryError
我假设分配给经理时实际上正在复制 numpy 数组,但我可能错了。
为了让事情变得更烦人,我在一台 32GB 内存的机器上观察内存使用情况,它在崩溃之前只会增加一点,最多可能增加 5%-10%。
谁能解释为什么将数组作为命名空间的属性会占用更多内存?以及为什么我的程序不会使用一些可用的空闲内存? (我已经阅读了namespace 和manager 文档以及这些managers 和namespace SO 上的线程。
我正在运行 Windows Server 2012 R2 和 Python 3.5.2 32 位。
这里有一些代码演示了我的问题(您需要使用 large.txt 的替代文件,该文件是大约 75MB 的制表符分隔字符串):
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'
【问题讨论】:
标签: python numpy memory out-of-memory python-multiprocessing