(原创)scrapy的MemoryError(后续)

scrapy的MemoryError(后续)


问题

之前写过一篇关于scrapy的MemoryError的博客,主要是介绍了MemoryError这个异常出现的原因和解决方案,但是对于其原因的探讨似乎还是不太明了,这次我们来深入探讨一下这个问题。
“`

分析

这个问题真正的原因是因为scrapy在大文件下载时出现的一个bug所致,深入分析其源代码可以发现,其在进行大文件下载的时候,是把所有的数据全部保存在内存中,之后再一次性的写入文件。
twisted的数据处理回调函数
其中dataReceived 方法是twisted定义的可继承方法,用于处理下载下来的数据内容。

这里写图片描述
这里的部分是下载完成之后的处理部分,通过添加一些输出我们可以看到其下载的内容会全部写入内存。这对大文件来说十分的不利。

这是一个会在2G内存,ubuntu12的机器上重现该问题的脚本
有一个“治标不治本”的办法就是降低爬虫的并发度,让其每次只进行一个大文件的下载,但是这样的话如果大文件本身大于机器内存大小的话就会出现问题。
更加根本的办法是修改这一机制,可以让大文件下载的过程中下载一部分就写入一部分。
(关于这点,本人已经fork了scrapy的代码库,如果有开发进展会第一时间报告给大家)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论

打赏作者

橘猫且engi

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值