【问题标题】:Python ValueError: not allowed to raise maximum limitPython ValueError:不允许提高最大限制
【发布时间】:2012-04-14 16:33:25
【问题描述】:

我在 mac os 10.7.3 上使用 python 2.7.2

我正在 python 中使用超过 50 000 个递归级别进行递归算法。

我尝试将最大递归级别增加到 1 000 000,但我的 python shell 在 18 000 递归级别后仍然退出。

我试图增加可用资源:

import resource 
resource.setrlimit(resource.RLIMIT_STACK, (2**29,-1))
sys.setrecursionlimit(10**6)

我得到这个错误:

Traceback (most recent call last):
  File "<pyshell#58>", line 1, in <module>
    resource.setrlimit(resource.RLIMIT_STACK,(2**29,-1))
ValueError: not allowed to raise maximum limit

不知道为什么不能提高上限?

感谢您的建议。

【问题讨论】:

    标签: python memory stack-overflow


    【解决方案1】:

    来自 python 文档:

    如果指定了无效资源,则引发 ValueError,如果新的软 限制超过了硬限制,或者如果一个进程试图提高它的硬限制 限制(除非进程具有超级用户的有效 UID)。能 如果底层系统调用失败,也会引发错误。

    由此我猜你的尝试新的软限制太大了。您可能需要重写您的算法以进行迭代。 Python 并不是真正设计用于处理这样的大规模递归。

    【讨论】:

    • thx,我是迭代做的,python不是为这么大的递归算法设计的
    【解决方案2】:

    虽然编写更有效的算法可能是一个更好的主意,但您可以通过以 root 身份运行 python 来提高硬限制(如文档中所述)。

    如果您以root 执行,您实际上可以使用以下行将堆栈大小设置为无限制:

    import resource
    resource.setrlimit(resource.RLIMIT_STACK, (resource.RLIM_INFINITY, resource.RLIM_INFINITY))
    

    【讨论】:

    • 我是根用户。在终端中执行python3,导入resource 并像这样设置限制会引发ValueError: not allowed to raise maximum limit
    猜你喜欢
    • 2020-10-12
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 2018-01-23
    • 2013-04-22
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    相关资源
    最近更新 更多