【问题标题】:Python 'resource' module - Negative values and unrecognised RLIMIT_VMEMPython“资源”模块 - 负值和无法识别的 RLIMIT_VMEM
【发布时间】:2023-03-18 16:52:01
【问题描述】:

我正在使用 Python resource module 来限制我的内存使用,方法如下:

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')。这可能是由我的操作系统的一些兼容性问题引起的吗?

【问题讨论】:

  • 另外,RLIMIT_MEM 和 RLIMIT_AS 有什么区别?
  • 输入单位不是字节吗?您对5*1024*1024 的限制不等于 5MB 而不是 5GB?
  • @Cyrille 我也怀疑...

标签: python resources


【解决方案1】:

如果您阅读getrlimit() Linux C 调用和prlimit 命令行工具的手册页,它们会隐约暗示-1 是常量RLIM_INFINITY 的值。

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

>>> resource.RLIM_INFINITY
-1

因此,本质上您是在尝试设置 Infinity 的软限制和小于该值的硬限制。硬限制必须大于或等于软限制。因此,您可以做这样的事情,这应该可以解决问题。

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

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

【讨论】:

    【解决方案2】:

    第 2 部分的答案resource 模块文档提到了这种可能性:

    这个模块不会试图掩盖平台差异——符号 未为平台定义将无法从此模块中使用 那个平台

    根据上面链接的bash ulimit 源,它使用 RLIMIT_AS 如果未定义 RLIMIT_VMEM

    来源:Limit memory usage?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 2014-02-08
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多