如何限制堆大小?

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

正因为如此,我想限制一个Python堆可以增长多less内存。 当达到限制时,程序可能会崩溃。 什么是最好的方法来做到这一点?

如果重要的话,Cython会写很多代码,所以应该考虑到在那里分配的内存。 我并不是纯粹的Python解决scheme(它不需要是可移植的),所以Linux上的任何东西都可以。

查看resource.setrlimit() 。 它只能在Unix系统上运行,但是它看起来可能就是你要找的东西,因为你可以使用resource.RLIMIT_DATA参数为你的进程和进程的subprocessselect一个最大的堆大小。

编辑:添加一个例子:

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中实现,所以如果你想从这个边界中恢复的话可能会很困难。

看看ulimit 。 它允许设置资源配额。 也可能需要适当的内核设置。