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

108 天前
 TeslaM3

各位大佬们,我最近在学习 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)

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

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

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


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

你的 process_data 呢?为啥会觉得 fetch_data 会出问题?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1058227

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX