如何判断句柄对象在matlab中使用了多少内存

Mar*_*arc 15 matlab class object handle matlab-class

如果我声明一个对象是句柄classdef的子类obj <handle我的对象现在基本上是某个某处内存的"指针".如何找出对象耗尽的内存量?

例如,假设我有一个带字段栏的类foo

classdef foo < handle 
properties
    bar = randn(1000);
end
Run Code Online (Sandbox Code Playgroud)

bar需要8兆字节(8字节*100万个数字)

但如果我输入

obj = foo();
whos('obj');
Run Code Online (Sandbox Code Playgroud)

我明白了

Name      Size            Bytes  Class    Attributes

  obj      1x1                60  foo                
Run Code Online (Sandbox Code Playgroud)

我如何找出obj指向的总内存量?

And*_*nke 11

作为一个黑客,将其转换为结构,看看占用多少空间.我认为这将公开"常规"对象字段中的所有数据.

f = foo();
origWarn = warning();
warning off 'MATLAB:structOnObject'
s = builtin('struct', f); % use 'builtin' in case @foo overrides struct()
warning(origWarn);
Run Code Online (Sandbox Code Playgroud)

然后你可以看到它.

>> whos
  Name      Size              Bytes  Class     Attributes

  f         1x1                  60  foo                 
  s         1x1             8000124  struct       
Run Code Online (Sandbox Code Playgroud)

这只是一阶近似.它会告诉你它的字段使用了多少内存.如果它们中的任何一个包含句柄对象,则需要递归该结构的字段并将任何其他句柄对象转换为struct以计算其字段.(如果你想包含Java对象的内存,你还需要一个单独的函数来估计它们的存储大小.可能不值得麻烦.)现在Matlab有闭包,函数句柄也可能包含数据; 如果你想计算封闭数据,你需要使用函数().

如果您正在使用句柄对象,则可能在M代码级别具有别名甚至循环引用,因此在递归时您需要注意这一点.(对不起,我不知道如何在新的面向对象系统中处理它.)

其中的内存显示也将通过Matlab的写时复制优化对共享内存的数组进行双重计数.这是一个具体的例子.

x = NaN(1,10000);
s.x = x;
s.y = x;
s.z = x;


>> whos
  Name      Size                Bytes  Class     Attributes

  s         1x1                240372  struct              
  x         1x10000             80000  double              
Run Code Online (Sandbox Code Playgroud)

实际上,s只消耗大约80K; 它只包含三个指向x的指针.并且80K与x本身消耗的80K相同.除非你修改其中任何一个; 然后分配一个新数组.Whos()不会让你区分这些案件.处理这个很难; AFAIK执行此操作的唯一方法是使用MEX文件获取mxarray的数据指针并自行遍历对象树,检测别名指针并计算别名字节.

这是在共享其组件时测量内存中对象大小的一般问题.它们不是离散的物理对象.至少你不在C中,使用指向任意内存块的指针.