【问题标题】:Python3.4 : OSError: [Errno 12] Cannot allocate memoryPython3.4:OSError:[Errno 12]无法分配内存
【发布时间】:2015-05-04 14:01:27
【问题描述】:

我正在 dijk_inner_mp.py 文件中初始化一堆 1048576 x 16 长的多处理数组:

N1=1048576
DEG1=16
P1=1
W = [[0 for x in range(DEG1)] for x in range(N1)]
W_index = [[0 for x in range(DEG1)] for x in range(N1)]
u = multiprocessing.Array('i',range(P1))
D = multiprocessing.Array('i',range(N1))
Q = multiprocessing.Array('i',range(N1))
l = [multiprocessing.Lock() for i in range(0,N1)]

在初始化之后,我创建了 P1 个在分配的数组上工作的进程。但是,我在执行时一直遇到此错误:

File "dijk_inner_mp.py", line 20, in <module>
    l = [multiprocessing.Lock() for i in range(0,N1)]
  File "dijk_inner_mp.py", line 20, in <listcomp>
    l = [multiprocessing.Lock() for i in range(0,N1)]
  File "/usr/lib/python3.4/multiprocessing/context.py", line 66, in Lock
    return Lock(ctx=self.get_context())
  File "/usr/lib/python3.4/multiprocessing/synchronize.py", line 163, in __init__
    SemLock.__init__(self, SEMAPHORE, 1, 1, ctx=ctx)
  File "/usr/lib/python3.4/multiprocessing/synchronize.py", line 60, in __init__
    unlink_now)
OSError: [Errno 12] Cannot allocate memory

在看到有关该问题的其他一些问题后,我尝试将交换文件大小增加几 Gb,但这似乎没有帮助。我还将大小从 1M 减小到 131K 并最终出现相同的错误。有关如何规避此问题的任何想法?

【问题讨论】:

  • cat /proc/swaps 输出什么?
  • 使用的文件名类型大小优先级 /dev/sda1 分区 3298300 42496 -1
  • 它创建了一个锁数组。如果我删除它,那么会出现错误 Q = multiprocessing.Array('i',range(N1)) 或任何其他数组
  • 我可以在 C/C++ 中运行类似的代码,这意味着内存量绝对不是问题。似乎有些东西限制了 python 进程可以使用的内存,因此它触发了这个断言。
  • 你说得对,我在运行代码时出错了,我每次在65112 锁周围都会出错

标签: python linux memory memory-leaks multiprocessing


【解决方案1】:

multiprocessing.Lock() 的每个实例都将/dev/shm/ 中的一个新信号量文件映射到内存中。

man mmap:

ENOMEM将超出进程的最大映射数。

(Errno 12 定义为ENOMEM。)

系统最大映射数由内核参数vm.max_map_count控制;您可以使用/sbin/sysctl vm.max_map_count 阅读。毫无疑问,您会发现系统上的这个值明显低于您要创建的锁数。

有关更改 vm.max_map_count 的方法,请参阅 e。 G。这个Linux Forums thread

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-24
    • 2013-08-01
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2019-08-23
    相关资源
    最近更新 更多