我有时编写Python程序,在执行之前很难确定它将使用多少内存.因此,我有时会调用一个Python程序,试图分配大量RAM,导致内核严重交换,并降低其他正在运行的进程的性能.
因此,我希望限制Python堆可以增加多少内存.当达到极限时,程序可能会崩溃.最好的方法是什么?
如果重要的话,很多代码都是用Cython编写的,所以它应该考虑分配给Cython的内存.我没有嫁给一个纯粹的Python解决方案(它不需要是可移植的),所以在Linux上工作的任何东西都可以.
我有时编写Python程序,在执行之前很难确定它将使用多少内存.因此,我有时会调用一个Python程序,试图分配大量RAM,导致内核严重交换,并降低其他正在运行的进程的性能.
因此,我希望限制Python堆可以增加多少内存.当达到极限时,程序可能会崩溃.最好的方法是什么?
如果重要的话,很多代码都是用Cython编写的,所以它应该考虑分配给Cython的内存.我没有嫁给一个纯粹的Python解决方案(它不需要是可移植的),所以在Linux上工作的任何东西都可以.
看看resource.setrlimit().它只在Unix系统上工作,但它似乎可能是您想要的,因为您可以使用资源为您的进程和进程的子进程 Select 最大堆大小.RLIMIT_数据参数.
编辑:添加示例:
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
我不确定你的用例到底是什么,但你可能需要用Resource来限制堆栈的大小.RLIMIT_STACK.超过此限制将向进程发送一个SIGSEGV信号,要处理它,需要使用setrlimit Linux manpage中描述的备用信号堆栈.不过,我不确定sigaltstack是否是用python实现的,所以如果您想从跨越这个界限的情况中恢复过来,这可能会很困难.