3

我最近使用 Matlab 的 OOP 编写了一些代码。在每个类对象中,我将一些测量数据保存为属性并定义评估它们的方法。对于平均数据集,一个类对象使用大约 32 MB 的内存。现在我正在编写一个应该处理这些对象的 GUI。

在第一步中,我从保存的 .mat 文件(大约 200 个对象,硬盘上 2GB)加载一组对象并将它们存储在句柄结构中。它们填满 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 之外,还有什么想法吗?

4

3 回答 3

2

我在 Matlab 错误报告中心找到了答案。似乎自 R2011b 以来就存在。

概括

在 MAT 文件中存储对象可能会导致内存泄漏并阻止对象类被清除

描述

在 MAT 文件中存储类的实例“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-14T08:55:34.983 回答
1

根据您的memory屏幕截图,肯定有没有被清除的内存。您在 Matlab 的垃圾收集中发现了一个基本缺陷的可能性很小,但更有可能的是,大约 6G 的内存驻留数据实际上仍然可以通过一系列链接获得。根据个人经验,以下几种方式可以让您认为已清除的内存仍然可用:

  • 计时器对象:如果计时器的回调函数之一引用此数据(或副本),则该数据仍然可用。你需要调用deleted(t)那个计时器。

  • 函数中的持久变量:我经常将数据缓存在函数中的持久变量中,这显然允许将来访问该数据,因此不会被清除。您需要调用clear FUNCTIONNAME以清除关联的持久变量。

  • 在 GUI 对象中,作为数据或在回调函数中:需要清除图形和任何持久性。

  • 类中可以保留数据的任何静态方法或常量属性。这些可以在班级内单独清除,也可以通过强制使用clear CLASSNAME

查找数据陈旧链接的一些技巧(同样,基于个人错误)

  • 查看每次调用后丢失的确切字节数,使用x=memory;调用获取准确计数。是否一致?这是一个你认识的数字吗?有时我可以在意识到它恰好是 238263232 字节后发现泄漏,因此是一个 29782904 双数组,它必须来自函数 xyz。

  • 查看实际删除了哪些类。在您的delete(obj)函数中添加详细显示或正在删除哪些对象,并通过推断哪些不是。对于给定的未删除对象,它可以从哪里引用?您不需要delete(obj)像您正在做的那样清除函数中的数据,Matlab 应该为您处理。使用该delete函数作为调试工具。

于 2013-02-12T18:35:56.880 回答
-1

Matlab 有一个垃圾收集器,所以你不需要手动管理内存。关闭 GUI 后,除了工作区中的内存之外,所有内存都将被释放。您可以使用 清除工作区变量clear

我在 Windows 上注意到的一件事(不确定其他平台)是 Matlab 的 GUI 有时会保留额外的内存(可能是 100 MB,但不像您看到的那样多 GB)。简单地最小化然后恢复 GUI 将释放这些多余的内存。

于 2013-02-12T13:59:01.537 回答