如何在python进程中限制内存使用

我在具有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 callsnewer 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.

上一篇:app前端性能1--apache bench压力测试工具


下一篇:ulimit打开文件数过多