通过多处理分配共享内存时出现虚假的内存不足错误

问题描述 投票:1回答:1

我正在尝试使用multiprocessing.RawArray在共享内存中分配一组图像缓冲区。它适用于少量图像。但是,当我到达一定数量的缓冲区时,会得到一个OSError,表明我的内存不足。

一个明显的问题,我实际上是内存不足吗?根据我的计算,我要分配的缓冲区应该大约有1 GB的内存,并且根据Windows Task Manager,我有大约20 GB的可用空间。我看不到实际上我怎么可能会内存不足!

我是否达到了我可以增加的某种人造内存消耗限制?如果没有,为什么会这样,我该如何解决?

我正在使用Windows 10,Python 3.7、64位体系结构,总共32 GB RAM。

这是最小的可复制示例:

import multiprocessing as mp
import ctypes

imageDataType = ctypes.c_uint8
imageDataSize = 1024*1280*3   # 3,932,160 bytes
maxBufferSize = 300
buffers = []
for k in range(maxBufferSize):
    print("Creating buffer #", k)
    buffers.append(mp.RawArray(imageDataType, imageDataSize))

输出:

Creating buffer # 0
Creating buffer # 1
Creating buffer # 2
Creating buffer # 3
Creating buffer # 4
Creating buffer # 5

...等...

Creating buffer # 278
Creating buffer # 279
Creating buffer # 280
Traceback (most recent call last):
  File ".\Cruft\memoryErrorTest.py", line 10, in <module>
    buffers.append(mp.RawArray(imageDataType, imageDataSize))
  File "C:\Users\Brian Kardon\AppData\Local\Programs\Python\Python37-32\lib\multiprocessing\context.py", line 129, in RawArray
    return RawArray(typecode_or_type, size_or_initializer)
  File "C:\Users\Brian Kardon\AppData\Local\Programs\Python\Python37-32\lib\multiprocessing\sharedctypes.py", line 61, in RawArray
    obj = _new_value(type_)
  File "C:\Users\Brian Kardon\AppData\Local\Programs\Python\Python37-32\lib\multiprocessing\sharedctypes.py", line 41, in _new_value
    wrapper = heap.BufferWrapper(size)
  File "C:\Users\Brian Kardon\AppData\Local\Programs\Python\Python37-32\lib\multiprocessing\heap.py", line 263, in __init__
    block = BufferWrapper._heap.malloc(size)
  File "C:\Users\Brian Kardon\AppData\Local\Programs\Python\Python37-32\lib\multiprocessing\heap.py", line 242, in malloc
    (arena, start, stop) = self._malloc(size)
  File "C:\Users\Brian Kardon\AppData\Local\Programs\Python\Python37-32\lib\multiprocessing\heap.py", line 134, in _malloc
    arena = Arena(length)
  File "C:\Users\Brian Kardon\AppData\Local\Programs\Python\Python37-32\lib\multiprocessing\heap.py", line 38, in __init__
    buf = mmap.mmap(-1, size, tagname=name)
OSError: [WinError 8] Not enough memory resources are available to process this command
python-3.x memory multiprocessing shared-memory allocation
1个回答
0
投票

确定,the folks over at Python bug tracker figured this out for me。对于后代:

我使用的是32位Python,它的内存地址空间限制为4 GB,比我的总可用系统内存少得多。显然,该空间已被其他内容占用,以致解释器无法为我的所有RawArray找到足够大的连续块。

最简单的解决方案似乎是切换到64位Python。

© www.soinside.com 2019 - 2024. All rights reserved.