我最近用Matlab的OOP写了一些代码。在每个类对象中,我将一些测量数据保存为属性,并定义评估它们的方法。对于平均数据集,单个类对象使用大约32MB的内存。现在,我正在编写一个处理这些对象的GUI。
在第一步中,我从保存的.mat-file (大约200个对象,硬盘上有2 2GB )加载一组对象,并将它们存储在handles结构中。它们会填满RAM,加载时会占用大约6-7 GB。这没问题。
但是如果我关闭GUI,我似乎无法释放已使用的内存。我尝试了不同的方法,但都没有成功。
在类的析构函数中将数据字段设置为“空”:
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之外,还有什么想法吗?
发布于 2013-02-14 16:55:35
我在Matlab Bug报告中心找到了答案。似乎从R2011b开始就存在了。
摘要
将对象存储在MAT文件中可能会导致内存泄漏,并阻止清除对象类
描述
在MAT-file中存储类'MyClass‘的实例后,调用clear classes可能会导致以下警告:
警告:存在'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。
发布于 2013-02-13 02:35:57
根据你的memory截图,肯定有内存没有被清除。您在Matlab的垃圾收集中发现基本缺陷的可能性很小,但更有可能的是,大约6 of的内存驻留数据实际上仍然可以通过某些系列的链接获得。根据个人经验,这里有几种方法可以让你认为被清除的内存仍然可用:
deleted(t):我经常在函数内的持久性变量中缓存数据,这显然允许将来访问该数据,因此它不会被清除。你需要调用clear FUNCTIONNAME来清除相关的持久化变量。clear CLASSNAME.强制清除
查找过时数据链接的一些技巧(同样,基于个人错误)
x=memory;调用来获取准确的计数,从而查看每次调用后丢失的确切字节数。它是一致的吗?它是你能识别的数字吗?有时,在意识到它正好是238263232字节,因此是一个29782904双精度数组后,我可以发现泄漏,这必须来自函数xyz。delete(obj)函数中,添加详细的显示或正在删除的对象,以及推断出哪些对象没有被删除。对于给定的未删除对象,可以从哪里引用它?你应该不需要像现在这样清除delete(obj)函数中的数据,Matlab会为你处理这些。请改用delete函数作为调试工具。发布于 2013-02-12 21:59:02
Matlab有一个garbage collector,所以你不需要手动管理内存。关闭GUI后,除工作区中的内存外,所有内存都将被释放。您可以使用clear清除工作区变量。
我在Windows上(对其他平台不太确定)注意到的一件事是,Matlab的GUI有时会保留额外的内存(可能是100MB,但不是您看到的几GB )。只需将GUI最小化,然后恢复,就可以释放这些多余的内存。
https://stackoverflow.com/questions/14834040
复制相似问题