Matlab:类对象的空闲内存

时间:2013-02-12 13:46:49

标签: class matlab memory

我最近使用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?

3 个答案:

答案 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将释放这些多余的内存。