12

我在 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

我不知道为什么我不能提高最高限额?

谢谢你的建议。

4

2 回答 2

6

从python文档:

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

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

于 2012-04-14T16:44:06.487 回答
3

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

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

import resource
resource.setrlimit(resource.RLIMIT_STACK, (resource.RLIM_INFINITY, resource.RLIM_INFINITY))
于 2012-08-28T14:25:37.003 回答