Class Matlab:类对象的自由内存

Class Matlab:类对象的自由内存,class,matlab,memory,Class,Matlab,Memory,我最近使用Matlab的OOP编写了一些代码。在每个类对象中,我将一些测量数据保存为属性,并定义评估它们的方法。对于平均数据集,单个类对象使用大约32MB的内存。 现在我正在编写一个GUI来处理这些对象 在第一步中,我从保存的.mat文件加载一组对象(大约200个对象,硬盘上2GB),并将它们存储在handles结构中。它们填充RAM并在加载时使用大约6-7GB。这没问题 但是如果我关闭GUI,似乎无法释放已使用的内存。 我尝试了不同的方法,但没有成功 在类的析构函数中将数据字段设置为“空”:

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

在第一步中,我从保存的.mat文件加载一组对象(大约200个对象,硬盘上2GB),并将它们存储在handles结构中。它们填充RAM并在加载时使用大约6-7GB。这没问题

但是如果我关闭GUI,似乎无法释放已使用的内存。 我尝试了不同的方法,但没有成功

在类的析构函数中将数据字段设置为“空”:

function delete(obj)
    obj.timeVector = [];
    obj.valueVector = [];
end
试图在figure\u 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有一个新功能,因此您不需要手动管理内存。关闭GUI后,除工作区中的内存外,所有内存都将被释放。可以使用清除工作空间变量


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

根据您的
内存
屏幕截图,肯定存在未被清除的内存。您很可能已经在Matlab的垃圾收集中发现了一个基本的缺陷,但更可能的是~6Gig内存驻留数据仍然可以通过一系列链接获得。根据个人经验,以下是您认为已清除的记忆仍然可用的几种方法:

  • 计时器对象:如果计时器的某个回调函数引用了此数据(或副本),则该数据仍然可用。您需要在该计时器上调用
    deleted(t)

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

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

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

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

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

  • 查看实际删除的类。在
    delete(obj)
    功能中,添加详细显示或哪些对象正在被删除,以及推断哪些对象没有被删除。对于给定的未删除对象,它可以从何处引用?您不需要像现在这样清除
    delete(obj)
    函数中的数据,Matlab应该为您处理。使用
    delete
    功能作为调试工具


我在Matlab Bug报告中心找到了答案。似乎从R2011b开始存在

摘要

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

说明

将类“MyClass”的实例存储在MAT文件中后,调用clear类可能会导致警告:

警告:“MyClass”类的对象存在。无法清除此类或其任何超类

即使已清除工作区中该类的所有实例,此警告仍然存在。 一种MAT文件格式可能会出现警告,而另一种格式则不会出现警告

解决方法

在某些情况下,切换到其他MAT文件格式可能会消除警告

编辑:
我尝试了旧的保存格式,但这也不起作用。我得到一个“关闭文件时出错”()。因此,Matlab不支持保存类对象。我将不得不忍受内存问题,并在每次使用GUI后重新启动Matlab。

您确定内存仍然被阻塞,而不仅仅显示为被占用吗?所以,如果你使用正常的内存量,你会用完吗?此外,我只能想到
清除所有
,但对此没有太多希望。因此我假设它只是由Matlab保留的,但如果另一个程序需要更多RAM,Matlab会释放它吗?我试图退出GUI,启动另一个RAM密集型程序,停止后,Matlab似乎释放了一些保留内存(参见链接)。我只是感到困惑,因为通常在GUI/脚本/函数退出后,Matlab的内存使用率会下降到正常的“空闲”使用率。在使用GUI之前、期间和之后执行
memory
命令的结果是什么?我无法格式化此注释中的输出,因此我制作了一个屏幕截图。i、 stack.imgur.com/Box1R.png编辑:如果我第二次运行GUI,中间不关闭Matlab,加载将花费更长的时间,并且
memory
命令给出:最大可能数组:Matlab使用的6137 MB内存:11456 MB比以前多,因此Matlab无法清理。很抱歉格式不正确,要习惯评论的风格。。。这是另一个(更好的)截图。我进一步缩小了范围。它不是GUI本身,而是保存/加载。由于文件大小的原因,我只是在工作区从头开始创建对象,并使用
-v7.3格式保存它们。清理wo