我在具有16GB Ram和64位操作系统的Linux机器上运行Python 2.7.我编写的python脚本可以将太多数据加载到内存中,这会使机器速度降低到我甚至无法再杀死进程的程度.
虽然我可以通过调用来限制内存:
ulimit -v 12000000
在运行脚本之前的shell中,我想在脚本本身中包含一个限制选项.在我看的每个地方,资源模块被引用为具有与ulimit相同的功能.但是打电话:
import resource
_, hard = resource.getrlimit(resource.RLIMIT_DATA)
resource.setrlimit(resource.RLIMIT_DATA, (12000, hard))
在我的脚本开头做什么都没有.即使设置低至12000的值也从未使过程崩溃.我尝试使用RLIMIT_STACK,结果相同.奇怪的是,打电话:
import subprocess
subprocess.call('ulimit -v 12000', shell=True)
什么都不做.
我究竟做错了什么?我在网上找不到任何实际的用法示例.
编辑:对于任何好奇的人,使用subprocess.call不起作用,因为它创建了一个(惊喜,惊喜!)新进程,它独立于当前python程序运行的进程.
解决方法:
resource.RLIMIT_VMEM
是资源corresponding to ulimit -v
.
RLIMIT_DATA only affects brk/sbrk
system calls而newer memory managers tend to use mmap
instead.
需要注意的第二件事是ulimit
/setrlimit
只影响当前进程及其未来的子进程.
关于AttributeError:’module’对象没有属性’RLIMIT_VMEM’消息:resource
module docs提到了这种可能性:
This module does not attempt to mask platform differences — symbols
not defined for a platform will not be available from this module on
that platform.
根据上面链接的bash
ulimit
source,如果未定义RLIMIT_VMEM,则使用RLIMIT_AS.