我最近使用Matlab的OOP编写了一些代码。在每个类对象中,我将一些测量数据保存为属性,并定义用于评估它们的方法。对于平均数据集,单个类对象使用大约32 MB的内存。 现在我正在编写一个应该处理这些对象的GUI。
在第一步中,我从已保存的.mat文件(大约200个对象,硬盘上的2GB)加载一组对象,并将它们存储在handle结构中。它们填充RAM并在加载时使用大约6-7 GB。这没问题。
但是如果我关闭GUI,似乎我无法释放已用过的内存。 我尝试了不同的方法但没有成功。
在类的析构函数中将数据字段设置为“empty”:
function delete(obj)
obj.timeVector = [];
obj.valueVector = [];
end
尝试在figure_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?
答案 0 :(得分:2)
我在Matlab Bug报告中心找到了答案。自R2011b以来似乎存在。
<强>摘要强>
在MAT文件中存储对象可能会导致内存泄漏并阻止清除对象类
<强>描述强>
在MAT文件中存储类的实例“MyClass”后,调用clear类可能会产生警告:
警告:存在“MyClass”类的对象。无法清除此类或其任何超类。
即使您已清除工作区中的所有类实例,此警告仍会存在。 对于一种MAT文件格式可能会发出警告,而对另一种格式则不会。
解决方法强>
在某些情况下,切换到不同的MAT文件格式可能会消除警告。
http://www.mathworks.ch/support/bugreports/857319
编辑: 我尝试使用较旧的格式进行保存,但这也不起作用。我收到“关闭文件时出错”(http://www.mathworks.ch/matlabcentral/answers/18098-error-using-save-error-closing-file)。因此,Matlab不支持保存类对象。我将不得不忍受内存问题,并在每次使用GUI后重新启动Matlab。
答案 1 :(得分:1)
根据您的memory
屏幕截图,肯定存在未被清除的内存。您在Matlab的垃圾收集中发现一个基本缺陷的可能性很小,但更有可能的是,通过一系列链接实际上仍然可以获得~6Gig的内存驻留数据。根据个人经验,这里有几种方法,你认为清除的记忆仍然可用:
计时器对象:如果计时器的其中一个回调函数引用了此数据(或副本),则该数据仍然可用。您需要在该计时器上调用deleted(t)
。
函数中的持久变量:我经常将数据缓存在函数内的持久变量中,这显然允许将来访问该数据,因此不会被清除。您需要调用clear FUNCTIONNAME
来清除关联的持久变量。
在GUI对象中,作为数据或回调函数:需要清除数字和任何持久性。
类中可以保留数据的任何静态方法或常量属性。这些可以在课堂上单独清除,也可以使用clear CLASSNAME
强制清除。
查找数据陈旧链接的一些提示(同样,基于个人错误)
查看每次调用后丢失的确切字节数,使用x=memory;
调用获取精确计数。它一致吗?这是你认可的号码吗?有时候我发现漏洞确实是238263232字节,因此是29782904双数组,它必须来自函数xyz。
查看实际删除的类。在delete(obj)
函数中添加详细显示或删除哪些对象,并通过推理添加,而不是。对于给定的未删除对象,它可以从哪里引用?你不应该像你一样清除delete(obj)
函数中的数据,Matlab应该为你处理。使用delete
函数作为调试工具。
答案 2 :(得分:-1)
Matlab有garbage collector,因此您无需手动管理内存。关闭GUI后,除工作区中的内容外,将释放所有内存。您可以使用clear
清除工作区变量。
我在Windows上注意到的一件事(不确定其他平台)是Matlab的GUI有时会保留额外的内存(可能是100 MB,但不像你看到的那样是多GB)。简单地最小化然后恢复GUI将释放这些多余的内存。