【问题标题】:Python Memory Leak - Why is it happening?Python 内存泄漏 - 为什么会发生?
【发布时间】:2015-06-08 22:38:30
【问题描述】:

关于我的问题的一些背景知识,我正在导入一个由其他人编写的模块 data_read_module.pyd,但我看不到该模块的内容。

我有一个文件,我们称之为myfunctions。暂时先忽略###,后面有评论的部分我再评论。

import data_read_module

def processData(fname):
    data = data_read_module.read_data(fname)
    ''' process data here '''     
    return t, x
    ### return 1

我在一个更大的程序框架内调用它,特别是一个 TKinter GUI。出于这篇文章的目的,我已经精简到了最基本的内容。在 GUI 代码中,我将上述代码调用如下:

import myfunctions 

class MyApplication:
    def __init__(self,parent):
        self.t = []
        self.x = []

    def openFileAndProcessData(self):
        # self.t = None
        # self.x = None
        self.t,self.x = myfunctions.processData(fname)
        ## myfunctions.processData(fname)

我注意到每次运行 openFileAndProcessData 时,Windows 任务管理器都会报告我的内存使用量增加,所以我认为我的 GUI 应用程序的某个地方存在内存泄漏。所以我尝试的第一件事是

# self.t = None
# self.x = None 

您在上面看到的评论。接下来,我尝试调用myfunctions.processData 而不将输出分配给任何变量,如下所示:

## myfunctions.processData(fname)

这也没有效果。作为最后的努力,我更改了 processData 函数,使其仅返回 1,甚至不处理来自模块 data_read_module.pyd 的任何数据。不幸的是,即使这样也会导致每次连续调用processData 都会占用更多内存,从而将问题缩小到data_read_module.read_data。我认为在 Python 框架中,这是自动处理的确切类型。参考this website,似乎函数占用的内存会在函数终止时释放。就我而言,我希望processData 中使用的内存在调用后被释放[除了我用 self.t 和 self.x 跟踪的输出]。我知道如果不访问data_read_module.pyd,我将无法解决此类问题,但我想了解如何开始。

【问题讨论】:

  • 有人忘记调用 free,如果你在堆上分配内存,你有责任释放它。
  • 如果您有权访问该模块,您可能能够反编译它并查看发生了什么(如果在 Python 端发生任何事情)。如果某些东西在 Python 上存储了越来越多的内存,您也许可以解决这个问题:github.com/Mysterie/uncompyle2 如果代码不能很好地反编译或不在 Python 端,听起来其中一个函数正在调用 C 代码正如帕德莱克所说,并没有释放内存。

标签: python memory-leaks


【解决方案1】:

.pyd 文件基本上是一个 DLL。您正在调用用 C、C++ 或其他此类编译语言编写的代码。如果该代码分配了内存并且没有正确释放它,您将遇到内存泄漏。从 Python 调用代码这一事实不会神奇地解决它。

【讨论】:

    猜你喜欢
    • 2018-06-08
    • 2021-08-15
    • 2011-05-13
    • 2011-06-28
    • 2013-04-01
    • 2016-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多