进程以退出码-1073741571结束

31

我正在尝试使用递归算法处理一个较大的图形。由于递归深度很大,我遇到了在Python: Maximum recursion depth exceeded中描述的问题。

所以,我尝试增加递归深度的限制,如下所示:

import sys
sys.setrecursionlimit(5000)

然而,无论我使用什么深度值,都不能得到我想要的结果。要么我仍然会收到异常,要么程序只是停滞在屏幕上没有输出,但是会显示如下内容:Process finished with exit code -1073741571

我该如何解决这个问题?


另请参见:Linux、Mac 和 Windows 的递归深度限制是多少?


1
你的程序有没有需要优化的地方呢? - thefourtheye
1
@thefourtheye 那里没有什么可以优化的。唯一需要优化的是将递归改为 while 循环 :-) - Salvador Dali
2
可能你正在尝试设置比环境允许的更大的限制。这会导致setrecursionlimit对你无效。 - CiaPan
@CiaPan 感谢您的澄清。递归限制过高的错误看起来不同,我已经检查过我的递归限制比我在这里使用的要高得多。 - Salvador Dali
是的,我知道。问题在于现在没有代码了。在绝望地尝试解决问题后,我放弃了并重新编写了它,而不使用递归。但是并没有A调用B,只是一个函数在递归调用自身。 - Salvador Dali
显示剩余10条评论
2个回答

22

这是Microsoft的“堆栈溢出/堆栈耗尽”错误代码0xC00000FD的有符号整数表示。

您可以尝试按照此答案中描述的方式增加可执行文件的堆栈大小:如何克服Visual Studio的堆栈大小问题(运行具有大型数组的C代码)

每当您在Windows中看到奇怪的、大的负退出代码时,将它们转换为十六进制,然后在ntstatus错误代码http://msdn.microsoft.com/en-us/library/cc704588.aspx中查找。

您还可以使用MS错误查找工具在本地查找此类代码,甚至自动查找。 Microsoft和第三方也提供其他类似的工具。


2
这应该是被接受的答案,它是正确的。不过需要提醒一下,你要检查有符号整数的 DWORD(32位)值。如果你不小心将其转换为 QWORD(Windows 计算器上的默认值),它将左填充 FFFF FFFF(或者你可以直接删除它们,剩下的就是正确的值)。 - Abel

16

你可以使用类似以下的东西:

if __name__ == '__main__':
    sys.setrecursionlimit(100000)
    threading.stack_size(200000000)
    thread = threading.Thread(target=your_code)
    thread.start()

这解决了我的递归限制和堆大小限制。


这会消除直接症状,有时候是可以的;但它并不能解决所有递归问题。特别是,如果你有一个无限递归,无论栈有多大,你都会用完栈空间。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接