【问题标题】:Why does this Python function not release memory after execution?为什么这个 Python 函数在执行后不释放内存?
【发布时间】:2015-03-10 11:19:20
【问题描述】:

我有一个 Python 脚本,它查看一个已通过 Beautiful Soup 传递的 XML 文件,以查找文本术语。然后我遍历到我想要提取的值并返回字符串。这行得通,但是当我在程序主循环中添加了对该函数的调用时,我最终遇到了 MemoryError 问题。查看Windows任务管理器发现每次调用后内存都没有释放,系统内存不足。问题似乎是“return myLink.string”行。这是否持有对内存中对象的引用,我该如何解决这个问题?

def FindUptime(soup):
    link = soup.find(text=re.compile("Uptime"))
    if link:
        myLink = link.parent
        myLink = myLink.next_sibling
        if myLink.string == "Up:":
            myLink = myLink.next_sibling
            myLink = myLink.next_element
        else:
            print "Can't find Up: term"
        return myLink.string
    else:
        print "Can't find Uptime"
        return ""

调用者

readings[sensorIds[i][SENSOR_NAME]] = FindUptime(soup)

【问题讨论】:

  • 程序主循环中返回的链接怎么办?
  • 嗨,返回结果被分配到一个结果字典。 (该脚本将服务器的正常运行时间汇总到一个字典中,然后将其写入 Powerpoint 报告)
  • 嗨,返回结果被分配到一个结果字典。 (该脚本将服务器的正常运行时间汇总到一个字典中,然后将其写入 Powerpoint 报告)
  • 你能做到以下几点:返回一个常量或一个像“100”这样的新字符串,而不是myLink.string,看看会发生什么?如果内存问题仍然存在,那么soup 可能在其方法的某处存在泄漏。另外,我会尝试只使用一次 re.compile() 并在所有后续 find()s 中使用结果(仅用于测试)
  • 尝试使用汤,但在返回 myLink.string 之前将字符串值复制到新的、干净的 Python 本机类型字符串中,然后返回复制的字符串。我有一个模糊的怀疑 myLink.string 可能有一些隐藏的引用。

标签: python memory beautifulsoup


【解决方案1】:

修改为...

def FindUptime(soup):
    link = soup.find(text=re.compile("Uptime"))
    if link:
        myLink = link.parent
        myLink = myLink.next_sibling
        if myLink.string == "Up:":
            myLink = myLink.next_sibling
            myLink = myLink.next_element
        else:
            print "Can't find Up: term"
        uptime = str(myLink.string) # added
        return uptime
    else:
        print "Can't find Uptime"
    return ""

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 2016-11-06
    • 1970-01-01
    • 2016-07-19
    • 2012-10-10
    • 1970-01-01
    • 2017-05-25
    相关资源
    最近更新 更多