【问题标题】:Matlab clear class propertyMatlab清除类属性
【发布时间】:2013-06-23 15:07:24
【问题描述】:

更新:检查接受的解决方案。问题与类属性无关。

我在 Matlab 中有以下问题,在谷歌或这里找不到任何东西。我有一个这样的句柄类:

classdef myClass < handle
  properties
    hugeCellArray
    otherVariables
  end
  ...
end

我将其实例化为myObj = myClass(data); 现在,如果我尝试:clear myObj.hugeCellArray 它根本没有清除财产。如果我尝试myObj.hugecellArray = []; 它确实将属性设置为 [] 但内存仍然被分配! 因此,除非我清除整个班级,否则似乎我无法摆脱班级中的巨大变量? 提前致谢!

编辑:(澄清)我的问题是内存。我不想真正删除类属性,我想释放它的内存。

【问题讨论】:

  • “内存仍在分配”是什么意思?
  • Matlab 仍在使用 ~10GB。这意味着它没有释放内存(?)。这意味着如果我调用另一个需要内存的函数,我将耗尽内存并开始写入交换。
  • 你确定你没有闭包或者其他地方仍然有对该属性的引用吗?将它设置为一个空数组应该会回收它的内存。另一个解释是你的内存变得太碎片化了
  • 如果是这样,恐怕一旦内存变得太碎片化,除了重启 MATLAB 之外,你无能为力。例如:stackoverflow.com/q/3300161/97160stackoverflow.com/q/16201005/97160
  • 我认为是的。相反,分配大块应该可以缓解这个问题。请记住,MATLAB 需要用于数值数据的连续内存。

标签: matlab class oop memory-management


【解决方案1】:

你不能在不清除整个对象本身的情况下“删除”一个对象的属性。

如果您关心的是内存,那么您的尝试确实会清除分配的内存:

myObj = myClass();
myObj.prop = rand(5000);
memory
myObj.prop = [];
memory

【讨论】:

  • 我在 linux 下没有“memory”命令,所以我无法证明这一点,但在这个命令之前和之后查看 matlab 在 linux 进程管理器中使用的内存,它使用完全相同的内存量.
  • 哦,抱歉,我忘记了memory 仅适用于 Windows。也许您可以尝试这里的建议:stackoverflow.com/q/4762044/97160
  • 它适用于我在 Win 上的 matlab。我可以看到使用 Windows 任务管理器也释放了内存。
【解决方案2】:

Amro 的解决方案:

显然问题出在元胞数组中。它们碎片化了我的记忆,之后无法重复使用。唯一的解决方法似乎是将元胞数组连接成一个巨大的数组,并保留每个子数组最初开始的位置。

【讨论】:

    【解决方案3】:

    也许你想找到这样的答案:

    d.a = 3;
    d.b = 4;
    c = 3;
    clear d.a
    

    d.b 和 c 仍然存在。

    【讨论】:

      猜你喜欢
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多