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

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

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

  1. VC中栈溢出/Stack overflow怎么办?

    看了以下文章你就清楚该怎么办了! 1 http://www.cnblogs.com/areliang/archive/2012/05/11/2495470.html 通过这篇文章我发现在大数组/二维数 ...

  2. Fatal Python error: Cannot recover from stack overflow.(嵌套层数过多超出限制)

    猜测是是try.except进入receive()函数子层数量太多了,嵌套太多层(据说默认1000层)超出python规定范围导致报错...以后估计不能使用这种结构了...通过sys.setrecur ...

  3. 深入全面探究有未经处理的异常: 0xC00000FD: Stack overflow(栈溢出)问题!

    深入全面探究有未经处理的异常: 0xC00000FD: Stack overflow(栈溢出)问题! 参考文章: (1)深入全面探究有未经处理的异常: 0xC00000FD: Stack overfl ...

  4. Visual Stdio VS 错误 error : 0xC00000FD: Stack overflow. 更改堆栈空间解决栈溢出问题

    Visual Stdio VS 错误 error : 0xC00000FD: Stack overflow. 更改堆栈空间解决栈溢出问题 参考文章: (1)Visual Stdio VS 错误 err ...

  5. 解决stack overflow栈溢出问题!

    今天又遇到"stack overflow"的问题,让我和一个同事头痛了好半天. 问题描述:VC++写的COM模块(ATL),用Delphi做客户端调用,运行时报"stac ...

  6. 笔记:Stack overflow栈溢出

    在函数递归中,当实现一个最简单的函数递归,如下: int main(){printf("hello");main(); return 0; } 在上述代码块中,main函数中打印完 ...

  7. Stack Overflow引入CROKAGE,搜问题不用再东拼西凑

    许多开发者使用 Stack Overflow 搜索开发中遇到的问题,有时候需要查询的结果中有通俗的讲解,而且最好还能够带上代码 demo,但是两者同时很完美地满足要求还是比较困难的.不过最近 Stac ...

  8. 我摸鱼写的Java片段意外称霸Stack Overflow十年、征服6000多GitHub开源项目: 有bug!...

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 Stack Overflow 上有一个 Java 代码片段称霸十年,是 Java 开发人员最爱复制的片段.超过6000个 GitHub ...

  9. 【07】函数调用:为什么会发生stack overflow?

    [计算机组成原理]学习笔记--总目录 [07]函数调用:为什么会发生stack overflow? 引言 一.为什么我们需要程序栈? 二.如何构造一个 stack overflow? 三.如何利用函数 ...

最新文章

  1. 中科院 工程硕士专业课 复试考试前的辅导安排
  2. dubbo部分常见的面试题目
  3. 公有云厂商DDoS防护产品竞品分析——内含CC的一些简单分析,貌似多是基于规则,CC策略细粒度ip/url//ua/refer...
  4. Split in Java
  5. session过期跳转到登陆页面并跳出iframe框架的最简单方法
  6. python代码在哪里输入-请问一下这个python代码到底是哪里出了问题?
  7. Python安装PyOpenGL
  8. WPF 菜单栏滚动到顶部后固定的两种方法
  9. struts+hibernate+oracle+easyui实现lazyout组件的简单案例——EmpDao层代码
  10. 方法覆盖(方法重写)
  11. Android studio快捷键大全 和 eclipse对照(原)
  12. L1-004. 计算摄氏温度-PAT团体程序设计天梯赛GPLT
  13. 判断客户端是否安装FlashPlayer及版本
  14. 华为盒子EC6108V9/V9U/V92/V97-HI3798MV100(免拆机-通刷固件)卡刷固件及教程
  15. 【运筹学】对偶理论 : 互补松弛性 ( 原问题与对偶问题标准形式 | 互补松弛定理 | 互补松弛定理示例说明 )
  16. MATLAB数学建模必备算法--层次分析法AHP
  17. 统计学学习日记:L5-离散趋势分析之异众比率与四分位差
  18. MT6580电池电压ADC完全不对,最高达到4.7V
  19. 行人重识别(21)——行人重识别算法性能指标
  20. 华为计算机技能,华为笔记本电脑技术参数及功能一览

热门文章

  1. 关于source insight 3.5 无法同步文件的问题
  2. 如何创建并运行 java 线程
  3. 汤家凤高等数学2020年强化笔记-第三模块-积分学
  4. 词法分析是否需要处理负数
  5. python中如果要多次输入文本,关于文本游戏:文本游戏 – 如果语句基于输入文本 – Python...
  6. linux如何时间更新最新版本,桌面应用|Linux有问必答:如何更新过期版本的Ubuntu...
  7. linux snmp设置报警次数,CentOS/RHEL 6下禁止重复的SNMP连接日志
  8. 鸿蒙os即将升级,央视爆料鸿蒙OS即将升级,荣耀智慧屏强大自研开启国货新时代...
  9. sklearn onehot
  10. python 正则学习笔记