首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab:类对象的空闲内存

Matlab:类对象的空闲内存
EN

Stack Overflow用户
提问于 2013-02-12 21:46:49
回答 3查看 3K关注 0票数 3

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

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

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

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

代码语言:javascript
复制
function delete(obj)
    obj.timeVector = [];
    obj.valueVector = [];
end

尝试在figure_CloseRequestFcn中释放它:

代码语言:javascript
复制
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之外,还有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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。

票数 2
EN

Stack Overflow用户

发布于 2013-02-13 02:35:57

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

  • 定时器对象:如果定时器的回调函数之一引用了this数据(或副本),则该数据仍然可用。您需要在函数中的timer.
  • Persistent变量上调用deleted(t):我经常在函数内的持久性变量中缓存数据,这显然允许将来访问该数据,因此它不会被清除。你需要调用clear FUNCTIONNAME来清除相关的持久化变量。
  • 在图形对象中,作为数据或者在回调函数中:图形和任何持久化都需要被清除。
  • 可以保留数据的类中的任何静态方法或常量属性。这些变量可以在类中单独清除,也可以使用clear CLASSNAME.

强制清除

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

  • 使用x=memory;调用来获取准确的计数,从而查看每次调用后丢失的确切字节数。它是一致的吗?它是你能识别的数字吗?有时,在意识到它正好是238263232字节,因此是一个29782904双精度数组后,我可以发现泄漏,这必须来自函数xyz。
  • 查看哪些类实际上被删除了。在您的delete(obj)函数中,添加详细的显示或正在删除的对象,以及推断出哪些对象没有被删除。对于给定的未删除对象,可以从哪里引用它?你应该不需要像现在这样清除delete(obj)函数中的数据,Matlab会为你处理这些。请改用delete函数作为调试工具。
票数 1
EN

Stack Overflow用户

发布于 2013-02-12 21:59:02

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

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14834040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档