使用 Requests HTTP 库了解 python 中的内存消耗增加

Posted

技术标签:

【中文标题】使用 Requests HTTP 库了解 python 中的内存消耗增加【英文标题】:Understanding memory consumption increase in python using Requests HTTP library 【发布时间】:2014-05-06 10:42:43 【问题描述】:

我正在使用 python v2.7 和 Requests HTTP library。我使用的是 Windows 7 操作系统。

我一直不明白为什么下面的代码在执行时会消耗越来越多的内存?我使用任务管理器观察到内存消耗。如果有人能指出可能的原因以及如何避免它,那就太好了?如果有人可以在他/她的系统上对此进行测试并确认不仅是我或我的系统面临这个问题,那就太好了。 :) 虽然内存消耗会少量增加,但我认为在某些时候,当没有更多可用内存时,我的应用程序肯定会崩溃。

代码

import requests
def getName():
    url = 'https://***.com/users/2382792/pss'
    r = requests.get(url)
    print r

while True:
    getName()

下面详细介绍了这个简单问题的原因。我对urllib2 module too. 也有类似的问题,所以我想到了使用 Requests HTTP 库。但是关于内存消耗的同样问题仍然存在。

真实世界场景:我的真实世界应用是用 python 和 wxPython 构建的。 wxPython 代码不会导致此问题。连接到 URL 以从服务器获取一些值的 python 代码导致了问题。为了保持值更新,每 2 秒获取一次值。这些获取的值随后会显示在 GUI 上。上面显示的代码是我原始代码的示例。此外,在上面的代码示例中,只有一个连接到 URL 的实例。 In my real world app I have 9-10 threads those are doing this fetching stuff by connecting to different URLs! Which means in this case the memory consumption increases more rapidly as compared to the above sample code. 我希望现在更清楚这个问题有多严重。另外,为了澄清,我并没有取消任何网站。

比较:为什么下面的代码和上面的代码没有同样的问题:

import random
def getValue():
    value = random.randrange(0,11)
    print value
while True:
    getValue()

更新:我测试了代码 sn-p 半小时。我终于得出结论,内存消耗在开始时会增加,然后它会处于减少和增加的状态。最后,内存消耗将保持在一个范围内。 这是在 Windows 8 操作系统上从 processExplorer 创建的图表。中间一个是内存(右击图片,点击查看看清楚):

感谢您的宝贵时间!

【问题讨论】:

这篇文章和你的previous question on the same subject有什么关系? 就目前而言,它们是重复的。只需简化第一个帖子并删除此帖子,或删除其他帖子并保留此帖子。 我认为 Python 的内存分配系统不会重新分配或释放内存。也许这个answer 有帮助或者这个one OSX Mavericks 中的内存使用成本为 9.7MB -> 10.1MB。 这是我发现的:为了让循环运行 100 次迭代,我的内存使用量增加了约 4.9 MB。对于 500 次迭代,它只增加了约 0.7 MB。我在请求库源代码中看不到任何缓存。也许,服务器缓存可能是罪魁祸首。无论如何,如果你想抓取一个网站,我建议你使用 scrapy - 它是异步的并且效率更高.. 【参考方案1】:

我测试了半个小时的代码sn-p。我终于得出结论,内存消耗在开始时会增加,然后它会处于减少和增加的状态。最后,内存消耗将保持在一个范围内。我相信这就是系统在阅读了有用的 cmets 后应该如何工作。 :)

【讨论】:

【参考方案2】:

我只能支持您原始帖子中的一些 cmets。我发现http://www.digi.com/wiki/developer/index.php/Python_Garbage_Collection 在您想更好地了解 gc 的情况下非常有用。

【讨论】:

以上是关于使用 Requests HTTP 库了解 python 中的内存消耗增加的主要内容,如果未能解决你的问题,请参考以下文章

爬虫-request和BeautifulSoup模块

python库requests登录zhihu

什么是Requests库?

python Requests库入门

[接口测试_B] 08 requests的基本用法

爬虫1.1-基础知识+requests库