如何限制堆大小?

car*_*arl 47 python linux memory

我有时会编写Python程序,这些程序在执行之前很难确定它将使用多少内存.因此,我有时会调用一个试图分配大量RAM的Python程序,导致内核大量交换并降低其他正在运行的进程的性能.

因此,我希望限制Python堆可以增加多少内存.达到限制时,程序可能会崩溃.最好的方法是什么?

如果重要,很多代码都是用Cython编写的,所以它应该考虑那里分配的内存.我没有与纯Python解决方案结合(它不需要是可移植的),所以在Linux上运行的任何东西都可以.

xit*_*ium 48

查看resource.setrlimit().它只能在Unix系统上运行,但它似乎可能是您正在寻找的,因为您可以使用resource.RLIMIT_DATA参数为进程和进程的子进程选择最大堆大小.

编辑:添加一个例子:

import resource

rsrc = resource.RLIMIT_DATA
soft, hard = resource.getrlimit(rsrc)
print 'Soft limit starts as  :', soft

resource.setrlimit(rsrc, (1024, hard)) #limit to one kilobyte

soft, hard = resource.getrlimit(rsrc)
print 'Soft limit changed to :', soft
Run Code Online (Sandbox Code Playgroud)

我不确定你的用例是什么,但是你可能需要使用resouce.RLIMIT_STACK来限制堆栈的大小.超过此限制将向您的进程发送SIGSEGV信号,并且为了处理它,您将需要使用setrlimit Linux 联机帮助页中所述的备用信号堆栈.我不确定sigaltstack是否在python中实现,所以如果你想要从越过这个边界恢复,这可能会很困难.

  • 你能给我举个例子吗?我尝试设置各种资源限制,但我仍然能够分配一个千兆字节列表.资源模块"感觉正确",但我不能让它在Linux上工作. (3认同)
  • 此外,我不关心如果达到限制会发生什么 - 程序可能崩溃,挂起或其他什么,只要它不会分配更多的内存. (2认同)
  • 是的,使用RLIMIT_DATA也不适用于我,但是RLIMIT_STACK是(Mac OS X). (2认同)