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

我正在尝试使用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
xx362973618 回答:通过多处理分配共享内存时出现虚假的内存不足错误

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

我使用的是32位Python,它的内存地址空间限制为4 GB,远远小于我的可用系统总内存。显然,该空间已被其他东西占用,以至于解释器找不到我所有RawArray的足够大的连续块。

使用64位Python时不会发生该错误,因此这似乎是最简单的解决方案。

本文链接:https://www.f2er.com/3026184.html

大家都在问