5

这是脚本的精简版本,导致内存使用量不断增加,我看到它在 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.url

links.txt 是一个包含大量 url 的文件,问题发生在我收集的几组大的 url 上。在我看来,响应对象可能没有受到尊重?

我今天更新了 gevent、requests 和 grequests,以下是它们的版本:

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

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

grequests 没有我能找到的版本号。

提前感谢您的任何答案。

4

3 回答 3

1

对于可能需要此链接的人,此答案只是别名和链接。

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

于 2013-11-29T04:04:23.543 回答
0

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

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

此代码未经测试,您会找到更好的解决方案,这应该证明您只是尝试同时打开太多链接并导致您的内存消耗。

于 2012-09-12T10:42:19.383 回答
0

应该更新项目的请求库依赖项。

较旧版本的请求,包括问题示例中使用的请求,默认情况下不会预先获取任何响应内容,由您来使用数据。这留下了对底层套接字的开放引用,因此即使请求会话被垃圾收集,套接字也不会被垃圾收集,直到响应超出范围或被response.content调用。

在更高版本的请求中,默认情况下会预先获取响应,并且如果会话是为满足模块级get/ post/etc 请求而临时创建的,例如在未传入会话时由 grequests 发出的请求,则会显式关闭会话连接. 这在请求 GitHub 问题 #520中有介绍。

于 2018-10-02T20:44:43.547 回答