2012-08-05 84 views
4

这使不断增加的内存使用脚本的一个精简版,我已经看到了它晃过600MB 2分钟后:“内存泄漏”与grequests?

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.url 

links.txt是含有大量URL的文件,这个问题发生在我收集的几个大型网站上。在我看来,反应对象可能不会被推断?

我更新GEVENT,请求和grequests今天,这里是他们的版本:

In [2]: gevent.version_info 
Out[2]: (1, 0, 0, 'beta', 3) 

In [5]: requests.__version__ 
Out[5]: '0.13.5' 

grequests没有一个版本号,我能找到。

在此先感谢您的任何答案。

+0

如果让脚本一直运行到链接列表的末尾,会发生什么情况?你会得到什么样的错误? – raben 2012-09-07 21:58:04

+0

我跑过一个不同的问题,但在同一脉络 - 响应对象离开文件句柄打开,这将最终导致资源枯竭..不确定如果这是一个**请求**或** grequests **问题。但我想我能明白为什么请求的作者不包括grequests作为标准模块的一部分。 – synthesizerpatel 2012-11-17 08:45:02

回答

0

从我的角度来看,这是因为您试图同时打开所有链接。尝试是这样的:

links = set(links) 
while links: 
    calls = (grequests.get(links.pop()) for x in range(200)) 
    for r in calls: 
     ...rest of your code 

这段代码是没有经过测试,你会发现更好的soluution,这应该是你simly试图在同一时间打开的链接过多的证明以及使你的内存消耗。

0

此答案只是一个别名,并且可能会链接回可能需要此link的人。

我使用imap函数和requests.Session来减少内存使用量,同时在脚本中发出380k请求。