Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 添加列表值时内存泄漏_Python_List_Memory Leaks - Fatal编程技术网

Python 添加列表值时内存泄漏

Python 添加列表值时内存泄漏,python,list,memory-leaks,Python,List,Memory Leaks,我是python新手,内存问题很大。我的脚本全天候运行,每天多分配1gb的内存。我可以把范围缩小到这个函数: 代码: 输出: 尤其是列表属性在600kb左右的每个周期都变得越来越大,我不知道为什么。在我看来,我没有在这里存储任何内容,每次都应该覆盖url变量。所以基本上应该有任何内存消耗 我错过了什么- 此内存泄漏100%是由您的内存泄漏测试造成的。“所有_对象”列表最终会维护一个几乎包含您创建过的所有对象的列表,即使是您不再需要的对象,如果它们不在所有_对象中,它们也会被清除,但它们确实存在

我是python新手,内存问题很大。我的脚本全天候运行,每天多分配1gb的内存。我可以把范围缩小到这个函数:

代码:

输出:

尤其是列表属性在600kb左右的每个周期都变得越来越大,我不知道为什么。在我看来,我没有在这里存储任何内容,每次都应该覆盖url变量。所以基本上应该有任何内存消耗


我错过了什么-

此内存泄漏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