使用Requests HTTP库时理解Python内存消耗增加的原因

7
我正在使用Python v2.7和Requests HTTP库。我正在使用Windows 7操作系统。
我不明白为什么以下代码在执行时会消耗越来越多的内存?我使用任务管理器观察了内存消耗情况。如果有人能指出可能的原因并说明如何避免,那就太好了。此外,如果有人可以在自己的系统上测试并确认这不仅仅是我的问题或我的系统面临这个问题,那就太好了。:)尽管内存消耗量增加了一点,但我认为在没有更多可用内存的情况下,我的应用程序肯定会崩溃。 代码:
import requests
def getName():
    url = 'https://stackoverflow.com/users/2382792/pss'
    r = requests.get(url)
    print r

while True:
    getName()

下面详细介绍了这个简单问题的原因。我在urllib2模块方面也遇到了类似的问题。因此,我考虑使用Requests HTTP库。但是,内存消耗方面的问题仍然存在。
现实场景:我的真实应用程序是用Python和wxPython构建的。wxPython代码不会引起此问题。连接到URL以从服务器获取一些值的Python代码会导致问题。为了保持这些值的更新,每2秒获取一次这些值,然后在GUI上显示这些值。上面显示的代码是我的原始代码的一个示例。此外,在以上代码示例中,只有一个连接到URL的实例。
比较:为什么以下代码没有与上面的代码相同的问题:
import random
def getValue():
    value = random.randrange(0,11)
    print value
while True:
    getValue()
更新:我测试了代码片段半个小时。我最终得出结论:内存消耗在开始时会增加,后来会呈现增加和减少的状态。最终,内存消耗将保持在一个范围内。这是从Windows 8操作系统的processExplorer创建的图表。中间的图表是关于内存的(右键单击图像并单击“查看”以清晰地查看):pexplorer

感谢您的时间!


1
我认为Python的内存分配系统没有重新分配或释放内存。也许这个答案可以帮助,或者是这个文章 - dorvak
1
在OSX Mavericks中,内存使用成本从9.7MB -> 10.1MB。 - Chien-Wei Huang
2
这是我找到的:让循环运行100次,我的内存使用量增加了约4.9 MB。对于500次迭代,它只增加了约0.7 MB。我在requests库源代码中没有看到任何缓存。也许是服务器缓存导致的。无论如何,如果你想要爬取一个网站,我建议你使用scrapy——它是异步的,效率更高。 - Shan Valleru
@ShanValleru 感谢您的努力!我希望增加内存不会在长期运行中导致我的应用程序崩溃。此外,我并没有爬取网站。在我的真实应用程序中,我只是使用线程连接到不同的URL以获取一些值。 - ρss
@J.F.Sebastian 我通常等待6-10分钟,而且时间还在增加。我将编辑我的问题并提供有关消耗量和时间跨度的更多细节。 - ρss
显示剩余6条评论
2个回答

0

0

我测试了半个小时的代码片段。最终我得出结论,内存消耗在开始时会增加,后来会进入一种既减少又增加的状态。最终内存消耗将保持在一个范围内。在阅读了有用的评论后,我相信这就是系统应该工作的方式。:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接