Python 'resource'模块 - 负值和无法识别的RLIMIT_VMEM

1 投票
2 回答
2227 浏览
提问于 2025-04-18 16:13

我正在使用Python的资源模块来限制我的内存使用,具体方法如下:

import resource
rsrc = resource.RLIMIT_AS
soft, hard = resource.getrlimit(rsrc)
resource.setrlimit(rsrc, (soft, 5*1024*1024))  # hard limit = 5GB

不过,我遇到了以下问题:

  1. 当前的hard限制是-1。这个值是什么意思呢?问题是,因为它是负数,我无法将硬限制设置得更高,所以出现了一个错误信息(ValueError: current limit exceeds maximum limit)。
  2. 与文档中说的不一样,resource模块没有RLIMIT_VMEM。当我尝试访问resource.RLIMIT_VMEM时,出现了一个错误(AttributeError: 'module' object has no attribute 'RLIMIT_VMEM')。这可能是因为我的操作系统存在一些兼容性问题吗?

2 个回答

1

第二部分的回答resource模块的文档提到了一种可能性:

这个模块并不试图掩盖不同平台之间的差异——在某个平台上未定义的符号在该平台上将无法通过这个模块使用。

根据上面链接的bash ulimit源代码,如果RLIMIT_VMEM没有定义,它会使用RLIMIT_AS

来源:限制内存使用?

2

如果你查看一下Linux C调用的getrlimit()prlimit命令的手册,你会发现它们模糊地提到-1这个值实际上代表了一个叫RLIM_INFINITY的常量。

你可以在Python中验证这一点。

>>> resource.RLIM_INFINITY
-1

所以,简单来说,你是想设置一个无限的软限制和一个小于这个限制的硬限制。硬限制必须大于或等于软限制。因此,你可以尝试这样做,这样应该就能解决问题。

hard_limit = 5 * 1024 * 1024
resource.setrlimit(rsrc, (hard_limit, hard_limit))

至于你的第二个问题,我也很想知道答案,这也是我来到这个问题的原因 :)

撰写回答