这是一个精简版本的脚本,导致内存使用量不断增加,我看到它在2分钟后超过600MB:
import requests
import grequests
lines = (grequests.get(l.strip(), timeout=15) for l in open('links.txt') if len(l.strip()))
for r in grequests.imap(lines, size=20):
if r.ok:
print r.urllinks.txt是一个包含大量urls的文件,这个问题发生在我收集的几个大urls组中。在我看来,响应对象可能没有被推迟?
我今天更新了gevent,request和grequest,下面是它们的版本:
In [2]: gevent.version_info
Out[2]: (1, 0, 0, 'beta', 3)
In [5]: requests.__version__
Out[5]: '0.13.5'grequests没有我能找到的版本号。
提前感谢您的回复。
发布于 2013-11-29 12:04:24
对于可能需要此link的人来说,此答案只是一个别名和链接。
我使用imap函数和requests.Session来减少内存使用,同时在我的脚本中发出380k请求。
发布于 2012-09-12 18:42:19
在我看来,这是因为你试图同时打开所有的链接。尝试如下所示:
links = set(links)
while links:
calls = (grequests.get(links.pop()) for x in range(200))
for r in calls:
...rest of your code这段代码没有经过测试,你会找到更好的解决方案,这应该是你试图同时打开太多链接并导致内存消耗的证据。
发布于 2018-10-03 04:44:44
应该更新项目的请求库依赖项。
较旧版本的请求,包括问题示例中使用的请求,默认情况下不会预取任何响应内容,让您来使用数据。这将保留对底层套接字的开放引用,因此即使请求会话被垃圾收集,套接字也不会被垃圾收集,直到响应超出作用域或调用response.content。
在更高版本的请求中,如果会话是为满足模块级get/post/etc请求而临时创建的,则默认情况下会预取响应,并且会话连接将显式关闭。这在requests GitHub issue #520中有介绍。
https://stackoverflow.com/questions/11815640
复制相似问题