Python内存泄漏 - 为什么会发生这种情况?

时间:2015-06-08 22:38:31

标签: python memory-leaks

关于我的问题的一些背景,我正在导入一个由其他人编写的模块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,我将无法解决此类问题,但我想了解一下这种情况会如何发生。

1 个答案:

答案 0 :(得分:3)

.pyd文件基本上是一个DLL。您正在调用用C,C ++或其他此类编译语言编写的代码。如果该代码分配内存并且未正确释放它,则会出现内存泄漏。从Python调用代码的事实不会神奇地修复它。