Class Matlab:类对象的自由内存
我最近使用Matlab的OOP编写了一些代码。在每个类对象中,我将一些测量数据保存为属性,并定义评估它们的方法。对于平均数据集,单个类对象使用大约32MB的内存。 现在我正在编写一个GUI来处理这些对象 在第一步中,我从保存的.mat文件加载一组对象(大约200个对象,硬盘上2GB),并将它们存储在handles结构中。它们填充RAM并在加载时使用大约6-7GB。这没问题 但是如果我关闭GUI,似乎无法释放已使用的内存。 我尝试了不同的方法,但没有成功 在类的析构函数中将数据字段设置为“空”:Class Matlab:类对象的自由内存,class,matlab,memory,Class,Matlab,Memory,我最近使用Matlab的OOP编写了一些代码。在每个类对象中,我将一些测量数据保存为属性,并定义评估它们的方法。对于平均数据集,单个类对象使用大约32MB的内存。 现在我正在编写一个GUI来处理这些对象 在第一步中,我从保存的.mat文件加载一组对象(大约200个对象,硬盘上2GB),并将它们存储在handles结构中。它们填充RAM并在加载时使用大约6-7GB。这没问题 但是如果我关闭GUI,似乎无法释放已使用的内存。 我尝试了不同的方法,但没有成功 在类的析构函数中将数据字段设置为“空”:
function delete(obj)
obj.timeVector = [];
obj.valueVector = [];
end
试图在figure\u CloseRequestFcn中释放它:
function figure_CloseRequestFcn(hObject, eventdata, handles)
handles.data = [];
handles = rmfield(handles,'data');
guidata(hObject,handles);
clear handles;
pack; %Matlab issues a warning, that pack could only
%be used from the command line, but that did
%not work either
delete(hObject);
end
除了每次使用GUI后关闭Matlab之外,还有什么好主意吗?Matlab有一个新功能,因此您不需要手动管理内存。关闭GUI后,除工作区中的内存外,所有内存都将被释放。可以使用清除工作空间变量
我在Windows上注意到的一件事(不确定其他平台)是,Matlab的GUI有时会保留额外的内存(可能是100 MB,但不像您看到的那样是多GB)。只需最小化并恢复GUI即可释放多余的内存。根据您的
内存
屏幕截图,肯定存在未被清除的内存。您很可能已经在Matlab的垃圾收集中发现了一个基本的缺陷,但更可能的是~6Gig内存驻留数据仍然可以通过一系列链接获得。根据个人经验,以下是您认为已清除的记忆仍然可用的几种方法:
- 计时器对象:如果计时器的某个回调函数引用了此数据(或副本),则该数据仍然可用。您需要在该计时器上调用
deleted(t)
- 函数中的持久变量:我经常将数据缓存在函数中的持久变量中,这显然允许将来访问该数据,因此它不会被清除。您需要调用
来清除相关的持久变量clear FUNCTIONNAME
- 在GUI对象中,作为数据或回调函数:需要清除图形和任何持久性
- 类中可以保留数据的任何静态方法或常量属性。这些可以在类内单独清除,也可以使用
强制清除clearclassname
- 使用
x=memory查看每次调用后丢失的确切字节数代码>调用以获取准确的计数。它是一致的吗?你认识这个号码吗?有时,我会在意识到它正是238263232字节后发现泄漏,因此是29782904双数组,它必须来自函数xyz
- 查看实际删除的类。在
功能中,添加详细显示或哪些对象正在被删除,以及推断哪些对象没有被删除。对于给定的未删除对象,它可以从何处引用?您不需要像现在这样清除delete(obj)
函数中的数据,Matlab应该为您处理。使用delete(obj)
功能作为调试工具delete
我尝试了旧的保存格式,但这也不起作用。我得到一个“关闭文件时出错”()。因此,Matlab不支持保存类对象。我将不得不忍受内存问题,并在每次使用GUI后重新启动Matlab。您确定内存仍然被阻塞,而不仅仅显示为被占用吗?所以,如果你使用正常的内存量,你会用完吗?此外,我只能想到
清除所有
,但对此没有太多希望。因此我假设它只是由Matlab保留的,但如果另一个程序需要更多RAM,Matlab会释放它吗?我试图退出GUI,启动另一个RAM密集型程序,停止后,Matlab似乎释放了一些保留内存(参见链接)。我只是感到困惑,因为通常在GUI/脚本/函数退出后,Matlab的内存使用率会下降到正常的“空闲”使用率。在使用GUI之前、期间和之后执行memory
命令的结果是什么?我无法格式化此注释中的输出,因此我制作了一个屏幕截图。i、 stack.imgur.com/Box1R.png编辑:如果我第二次运行GUI,中间不关闭Matlab,加载将花费更长的时间,并且memory
命令给出:最大可能数组:Matlab使用的6137 MB内存:11456 MB比以前多,因此Matlab无法清理。很抱歉格式不正确,要习惯评论的风格。。。这是另一个(更好的)截图。我进一步缩小了范围。它不是GUI本身,而是保存/加载。由于文件大小的原因,我只是在工作区从头开始创建对象,并使用-v7.3格式保存它们。清理wo