我有几个进程,每个进程都完成需要单个大 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%。
有人可以解释一下吗为什么使数组成为命名空间的属性会占用更多内存? and 为什么我的程序不会使用一些可用的空闲内存?(我已经读过名称空间 https://docs.python.org/3.6/tutorial/classes.html#python-scopes-and-namespaces and manager https://docs.python.org/3.6/library/multiprocessing.html#multiprocessing.managers文档以及这些managers https://stackoverflow.com/questions/22487296/multiprocessing-in-python-sharing-large-object-e-g-pandas-dataframe-between and 名称空间 https://stackoverflow.com/questions/3913217/what-are-python-namespaces-all-aboutSO 上的线程。
我正在运行 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'