我最近使用 Matlab 的 OOP 编写了一些代码。在每个类对象中,我将一些测量数据保存为属性并定义评估它们的方法。对于平均数据集,一个单一类对象使用大约 32 MB 的内存。 现在我正在编写一个应该处理这些对象的 GUI。
在第一步中,我从保存的 .mat 文件中加载一组对象(大约 200 个对象,硬盘上 2GB)并将它们存储在 handles 结构中。它们填充 RAM 并在加载时使用大约 6-7 GB。这没问题。
但如果我关闭 GUI,似乎无法释放已用内存。 我尝试了不同的方法但没有成功。
在类的析构函数中将数据字段设置为“空”:
function delete(obj)
obj.timeVector = [];
obj.valueVector = [];
end
图中试图释放它_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 错误报告中心找到了答案。似乎从 R2011b 开始就存在。
总结
在 MAT 文件中存储对象会导致内存泄漏并阻止对象类被清除
描述
在 MAT 文件中存储类“MyClass”的实例后,调用清除类可能会导致警告:
警告:“MyClass”类的对象存在。无法清除此类或其任何父类(super class)。
即使您已清除工作区中该类的所有实例,此警告仍然存在。 一种 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。
关于class - Matlab:类对象的空闲内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14834040/