Python 添加列表值时内存泄漏
我是python新手,内存问题很大。我的脚本全天候运行,每天多分配1gb的内存。我可以把范围缩小到这个函数: 代码: 输出: 尤其是列表属性在600kb左右的每个周期都变得越来越大,我不知道为什么。在我看来,我没有在这里存储任何内容,每次都应该覆盖url变量。所以基本上应该有任何内存消耗Python 添加列表值时内存泄漏,python,list,memory-leaks,Python,List,Memory Leaks,我是python新手,内存问题很大。我的脚本全天候运行,每天多分配1gb的内存。我可以把范围缩小到这个函数: 代码: 输出: 尤其是列表属性在600kb左右的每个周期都变得越来越大,我不知道为什么。在我看来,我没有在这里存储任何内容,每次都应该覆盖url变量。所以基本上应该有任何内存消耗 我错过了什么- 此内存泄漏100%是由您的内存泄漏测试造成的。“所有_对象”列表最终会维护一个几乎包含您创建过的所有对象的列表,即使是您不再需要的对象,如果它们不在所有_对象中,它们也会被清除,但它们确实存在
我错过了什么- 此内存泄漏100%是由您的内存泄漏测试造成的。“所有_对象”列表最终会维护一个几乎包含您创建过的所有对象的列表,即使是您不再需要的对象,如果它们不在所有_对象中,它们也会被清除,但它们确实存在 作为快速测试: 如果我按原样运行这段代码,我得到的列表值将以大约600KB/周期的速度增长,正如您在问题中所说的,至少会增长到20MB,我在这段代码中终止了它 但是,如果在sum1=行之后添加del all_对象,则列表值会在100KB和650KB之间来回跳动 如果你想一想为什么会发生这种情况,回想起来是很明显的。在调用muppy.get_对象(第一次除外)时,所有_对象的上一个值仍然有效。因此,它是返回的对象之一。这意味着,即使将返回值指定给所有_对象,也不是释放旧值,而是将其refcount从2降至1。它不仅使旧值本身保持活动,而且使其中的每个元素保持活动,根据定义,这些元素是上次通过循环时活动的所有元素
如果您能找到一个内存探索库,它为您提供weakrefs而不是普通的引用,这可能会有所帮助。否则,在再次调用muppy.get_对象之前,请确保在某个时候删除所有_对象。就在您使用它的唯一位置之后,sum1=行似乎是最明显的位置。当您运行这个示例代码时,使用这个最小的get\u url函数,您会看到每个循环都有600KB的列表存储空间吗?或者你在你的真实程序中看到了吗?是的,如果我运行这个示例代码,每个循环大约有600KB的列表存储。macos和linux上的Python 2.7.2。哦,亲爱的。。。有趣的是,在我的真实程序中,某个地方有漏洞,因为它运行时没有muppy的东西。我显然得再找一次。这次使用“删除所有对象”。谢谢你,伙计!或者干脆不将其存储在变量中:summary.print\u summary.summarimeUppy.get_objects@Ngenator:是的,我想推荐一下。归根结底,对于像OP这样需要阅读或扩展此代码的人来说,6个月后哪一个更清晰?我认为显式del可以很好地提醒我们,我们刚刚创建了一个整个宇宙的列表……但另一方面,您可能会争辩说,提醒的重要性不足以让它妨碍代码。
#!/usr/bin/env python
# coding: utf8
import gc
from pympler import muppy
from pympler import summary
from pympler import tracker
v_list = [{
'url_base' : 'http://www.immoscout24.de',
'url_before_page' : '/Suche/S-T/P-',
'url_after_page' : '/Wohnung-Kauf/Hamburg/Hamburg/-/-/50,00-/EURO--500000,00?pagerReporting=true',}]
# returns url
def get_url(v, page_num):
return v['url_base'] + v['url_before_page'] + str(page_num) + v['url_after_page']
while True:
gc.enable()
for v_idx,v in enumerate(v_list):
# mem test ouput
all_objects = muppy.get_objects()
sum1 = summary.summarize(all_objects)
summary.print_(sum1)
# magic happens here
url = get_url(v, 1)
# mem test ouput
all_objects = muppy.get_objects()
sum1 = summary.summarize(all_objects)
summary.print_(sum1)
# collects unlinked objects
gc.collect()
======================== | =========== | ============
list | 26154 | 10.90 MB
str | 31202 | 1.90 MB
dict | 507 | 785.88 KB