V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
bwijn
V2EX  ›  Python

scrapy 的 item 队列把内存挤爆

  •  
  •   bwijn · 20 天前 · 1883 次点击

    scrapy 的 spider 抓取了很多 item 然后交给 pipeline, 但是 pipeline 处理的太慢了,我的业务很耗时,但是 spider 还在不停抓取,导致任务积压

    我目前打算使用 arq(异步消息框架) spider 抓到的 item 直接扔给 arq,扔之前查看任务队列是否过多,可以暂停发布任务

    各位有好的想法吗

    5 条回复    2025-02-08 10:40:51 +08:00
    Rang666
        1
    Rang666  
       20 天前 via Android
    内存不够就放硬盘存着?
    CaptainD
        2
    CaptainD  
       20 天前
    无非就几个方法
    1. 减缓 item 发布:例如你的方式,或者降低 spider 速度等
    2. 增大缓冲区,例如引入新的队列、持久化 pipeline 等
    3. 增大 pipeline 处理速度,并发或者异步等
    shuimugan
        3
    shuimugan  
       20 天前
    scrapy 出来的时候还没什么 serverless 的概念,都是靠堆机器的方式来增加抓取规模,但是它的 IO 和计算没有分离,必然造成你现在这个局面。
    一旦你加入队列来把 IO 和计算分离之后,你会发现你也用不上什么 scrapy 自己的东西了。
    除非你的清洗是视频转码之类的众生平等的耗时任务,如果是单纯搞搞字符串之类的,可以使用 cloudflare worker 把计算部分分离出去,甚至把 IO 部分也可以分离出去( IO 等待不计时,deno deploy 也是)。
    mayli
        4
    mayli  
       20 天前
    CONCURRENT_ITEMS
    Maerd
        5
    Maerd  
       11 天前
    pipeline 处理 item 比抓取还慢?那要考虑你的储存架构设计方式了,自己存东西怎么会比爬慢

    如果暂时无法解决,将 item 队列从内存队列换为磁盘队列即可,这样会 spider 在 yield item 的时候,item 会被先序列化到磁盘上,就不占用内存了

    还有楼上说的 io 和计算没分离纯属没怎么用过 scrapy
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5717 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 03:27 · PVG 11:27 · LAX 19:27 · JFK 22:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.