知识点讲解四:栈溢出(stack overflow)问题解决方案

在爬取某个网页的时候遇到了这个问题:

Fatal Python error: Cannot recover from stack overflow


我问题所在:使用函数时递归调用次数过多(800左右会出现),导致栈溢出。

在Python中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,相当于一次push压栈操作,每当函数返回,相当于一次pop出栈操作。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

Windows程序的内存机制大概是这样的,全局变量(局部的静态变量本质也属于此范围)存储于堆内存,该段内存较大,一般不会溢出;函数地址、函数参数、局部变量等信息存储于栈内存,栈内存较小容易发生溢出现象,但是效率高。


栈溢出的可能原因:
1. 函数递归调用层次过深 ,每调用一次,函数的参数、局部变量等信息就压一次栈,并且没有及时出栈。
2. 局部变量体积太大

可以通过下面这张图来辅助我们理解,当栈的空间接近被占完时,会发生溢出现象

还在路上,稍等...

解决方案:
1.把递归调用函数改用while或者for循环来实现
2.通过尾递归优化
3.改用堆内存,函数里定义很大的局部变量(例如大数组),这种情况可以将局部变量改为静态变量(实质上也是全局变量)。
4.增大栈的大小值


参考文章:https://blog.csdn.net/zcyzsy/article/details/77151709
https://stackoverflow.com/questions/40963288/fatal-python-error-cannot-recover-from-stack-overflow-during-flood-fill
https://blog.csdn.net/qq_34178562/article/details/78198755
https://blog.csdn.net/xc889078/article/details/8796880

标签