关于我的问题的一些背景,我正在导入一个由其他人编写的模块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
,我将无法解决此类问题,但我想了解一下这种情况会如何发生。
答案 0 :(得分:3)
.pyd
文件基本上是一个DLL。您正在调用用C,C ++或其他此类编译语言编写的代码。如果该代码分配内存并且未正确释放它,则会出现内存泄漏。从Python调用代码的事实不会神奇地修复它。