我在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
我不知道为什么我不能提高最高限额?
感谢您的建议。
答案 0 :(得分:6)
来自python文档:
如果指定了无效资源,则引发ValueError(如果是新软件) 限制超过了硬限制,或者如果一个进程试图提高其难度 限制(除非进程具有超级用户的有效UID)。能够 如果底层系统调用失败,也会引发错误。
由此我猜你尝试新的软限制太大了。您可能需要将算法重写为迭代。 Python并不是真的设计用来处理像这样的大规模递归。
答案 1 :(得分:2)
虽然编写一个更有效的算法可能是一个更好的主意,但你可以通过以root身份运行python来提高硬限制(如文档中所述)。
如果执行为root
,您实际上可以使用以下行将堆栈大小设置为无限制:
import resource
resource.setrlimit(resource.RLIMIT_STACK, (resource.RLIM_INFINITY, resource.RLIM_INFINITY))