我在具有16GB Ram和64位操作系统的Linux机器上运行Python 2.7。我写的一个python脚本可以将太多的数据加载到内存中,这会使机器速度降低到我甚至无法再杀死进程的程度。
虽然我可以通过调用来限制记忆:
MULTIPLE_INTERVAL_SELECTION
在运行脚本之前在我的shell中,我想在脚本本身中包含一个限制选项。在我看过的每个地方,ulimit -v 12000000
模块被称为具有与resource
相同的能力。但是打电话:
ulimit
在我的脚本开头的绝对没有。即使设置低至12000的值也从未使过程崩溃。我用import resource
_, hard = resource.getrlimit(resource.RLIMIT_DATA)
resource.setrlimit(resource.RLIMIT_DATA, (12000, hard))
尝试了相同的结果,同样的结果。奇怪的是,打电话:
RLIMIT_STACK
也没有做任何事情。
我做错了什么?我无法在线找到任何实际使用示例。
编辑:对于任何好奇的人来说,使用import subprocess
subprocess.call('ulimit -v 12000', shell=True)
并不起作用,因为它会创建一个(惊喜,惊喜!)新进程,该进程独立于当前python程序运行的进程。 / p>
答案 0 :(得分:12)
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' object has no attribute 'RLIMIT_VMEM'
消息:resource
module docs提到了这种可能性:
此模块不会尝试屏蔽平台差异 - 符号 此模块不提供未定义的平台 那个平台。
根据上面链接的bash
ulimit
source,如果未定义RLIMIT_AS
,则会使用RLIMIT_VMEM
。