gpt4 book ai didi

python - 添加列表值时发生内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-04 01:12:55 25 4
gpt4 key购买 nike

我是 python 的新手并且有很大的内存问题。我的脚本全天候运行 24/7,每天它都会分配大约 1GB 的内存。我可以将其缩小到这个功能:

代码:

#!/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

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

我在这里错过了什么? :-)

最佳答案

这种“内存泄漏”100% 是由您对内存泄漏的测试造成的。 all_objects 列表最终会维护您创建的几乎所有对象的列表——即使是您不再需要的那些,如果它们不在 all_objects< 中,它们就会被清理掉,但它们是。

作为快速测试:

  • 如果我按原样运行这段代码,我得到的 list 值会以大约 600KB/周期的速度增长,就像你在问题中所说的那样,至少达到 20MB,我杀了它。

  • 但是,如果我在 sum1 = 行之后添加 del all_objects,我会得到 list 值来回跳动在 100KB 到 650KB 之间。

如果您思考为什么会发生这种情况,回想起来就会很明显。在您调用 muppy.get_objects() 时(第一次除外),all_objects 的原值仍然存在。因此,它是返回的对象之一。这意味着,即使您将返回值分配给 all_objects,您也不会释放旧值,您只是将其引用计数从 2 降为 1。这不仅使旧值保持活力本身,但它里面的每个元素——根据定义,这是上次通过循环存活的所有东西。

如果您能找到一个内存探索库,它为您提供弱引用而不是普通引用,那可能会有所帮助。否则,请确保在再次调用 muppy.get_objects 之前的某个时刻执行 del all_objects。 (在您唯一使用它的地方之后,sum1 = 行,似乎是最明显的地方。)

关于python - 添加列表值时发生内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26554102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com