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
TeslaM3
V2EX  ›  Python

[求助] Python 新手遇到诡异的内存泄漏问题,大神们来帮忙

  •  
  •   TeslaM3 · 114 天前 · 1102 次点击
    这是一个创建于 114 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各位大佬们,我最近在学习 Python 爬虫,遇到个奇怪的问题。我在处理大量数据时,程序运行一段时间后会突然卡死,排查发现可能是内存泄漏。代码里用到 requests 和 BeautifulSoup ,但怎么检查也找不出问题所在。有没有熟悉这方面的老司机能指点迷津?附上部分关键代码:

    def fetch_data(url):
        response = requests.get(url)
        soup = BeautifulSoup(response.text, 'html.parser')
        data = soup.find_all('div', class_='data-element')
        return data
    
    # 无限循环爬取
    while True:
        data_list = fetch_data('http://xxx.com')
        process_data(data_list)
    

    如果是我理解错了,请纠正。感激不尽!

    8 条回复
    TeslaM3
        1
    TeslaM3  
    OP
       114 天前
    怎么无人!
    ZhaiSoul
        2
    ZhaiSoul  
       114 天前
    Python 再怎么慢,你这个 while 循环一直爬取……也过分了点吧,你没有进行周期等待的话,每秒可能执行上万次,GC 都还没来得及你就已经炸了
    ZhaiSoul
        3
    ZhaiSoul  
       114 天前
    @ZhaiSoul 哦,查了一下,requests 不是异步的,那我收回前面的话
    不过我个人还是建议用异步的请求库会好一些
    TeslaM3
        4
    TeslaM3  
    OP
       114 天前
    @ZhaiSoul 😁
    ClericPy
        5
    ClericPy  
       114 天前   ❤️ 1
    突然卡死你是怎么定位出内存泄漏这个类别的。。。

    Requests 这个库当年确实会有各种问题,很早年有个 session cache 相关的死锁还是什么会卡住一直不继续,后来还遇到过 session 、Response 没正确关闭导致的类似泄漏的情况,所以长时间运行的基本都不用默认 requests 发请求,而是一直 with session 和 with Response


    信息太少,只能提供思路:
    1. Python 有很多进程运行时工具可以看出你 hang 在哪一行的,先定位下是哪一行再直接撸 Requests 源码找细节。反正就是先看是哪一行停住了
    2. 升级 Requests 库,或者换 httpx ,反正 api 都一样的,看看能复现没有
    3. 你这个 Requests 但凡加个 Timeout ,也能让别人排除一个问题,有时候 TCP 操作不当或者 Server 写的不行,确实会挂住连接
    TeslaM3
        6
    TeslaM3  
    OP
       114 天前
    @ClericPy 谢谢,刚学习 py
    lLuO0WljRTqf
        7
    lLuO0WljRTqf  
       114 天前
    requests 连接的时候我记得有个 timeout 的参数。
    另外,爬取时请加延时。你访问那么快,如何保证对方网站不禁你 ip 一段时间呢?
    wang93wei
        8
    wang93wei  
       109 天前
    我在处理大量数据时,程序运行一段时间后会突然卡死,排查发现可能是内存泄漏。

    你的 process_data 呢?为啥会觉得 fetch_data 会出问题?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1580 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 17:10 · PVG 01:10 · LAX 09:10 · JFK 12:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.