一尘不染

如何限制堆大小?

linux

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

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

如果重要的话,很多代码都用Cython编写,因此应该考虑在那里分配的内存。我还没有嫁给一个纯粹的Python解决方案(它不需要是可移植的),因此在Linux上运行的任何东西都可以。


阅读 286

收藏
2020-06-02

共1个答案

一尘不染

签出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

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

2020-06-02