【发布时间】: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