前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬虫问题一:栈溢出(stack overflow)问题解决方案

爬虫问题一:栈溢出(stack overflow)问题解决方案

作者头像
K同学啊
发布2019-01-22 15:12:53
4.7K0
发布2019-01-22 15:12:53
举报

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年08月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档