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

如何在matlab中判断句柄对象使用了多少内存,matlab,class,object,handle,matlab-class,Matlab,Class,Object,Handle,Matlab Class,如果我声明一个对象是handle的子类 classdef obj

如果我声明一个对象是handle的子类 classdef obj<句柄 我的对象现在本质上是指向某个内存的“指针”。如何找出我的对象使用了多少内存

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

classdef foo < handle 
properties
    bar = randn(1000);
end
我明白了


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

作为一个黑客,将其转换为一个struct,看看它占用了多少空间。我认为这将公开“常规”对象字段中的所有数据

f = foo();
origWarn = warning();
warning off 'MATLAB:structOnObject'
s = builtin('struct', f); % use 'builtin' in case @foo overrides struct()
warning(origWarn);
然后你可以在WHO中看到它

>> whos
  Name      Size              Bytes  Class     Attributes

  f         1x1                  60  foo                 
  s         1x1             8000124  struct       
这只是一阶近似值。它将告诉您其字段使用了多少内存。如果其中任何一个包含句柄对象,则需要递归该结构的字段,并将任何其他句柄对象转换为该结构以计算其字段数。(如果你想包含Java对象的内存,你还需要一个单独的函数来估计它们的存储大小。可能不值得费心。)既然Matlab有了闭包,函数句柄也可能包含数据;如果要计算已关闭的数据,则需要输入使用函数()的用户

如果使用句柄对象,可能会在M代码级别出现别名甚至循环引用,因此在递归时需要注意这一点。(对不起,我不知道在新的OO系统中如何处理这个问题。)

whos中的内存显示还将加倍计数通过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              
实际上,s只消耗了大约80K;它只包含三个指向x的指针。这80K和x本身消耗的80K是一样的。除非您修改其中任何一项;然后分配一个新数组。Whos()不允许您区分这些情况。处理起来很难,;AFAIK做到这一点的唯一方法是使用MEX文件获取mxarray的数据指针,并自己遍历对象树,检测别名指针并计算别名字节


当对象的组件可以共享时,这是测量内存中对象大小的一个普遍问题。它们不是离散的物理对象。至少你不在C语言中,使用指向任意内存块的指针。

我刚刚找到的一个简单方法就是建议。我想把它放在这里

从基类派生类,该基类提供一个方法,该方法从其所有属性收集数据。代码取自上面给定的链接

    function total_mem = get_mem(obj) 
        %// Get all properties
        props = properties(obj); 

        total_mem = 0;
        %// Loop properties
        for ii=1:length(props)
            %// Make shallow copy
            curr_prop = obj.(props{ii});  %#ok<*NASGU>
            %// Get info struct for current property
            s = whos('curr_prop');
            %// Add to total memory consumption
            total_mem = total_mem + s.bytes; 
        end
    end

谢谢这真是个好建议。有一个问题,因为我不明白matlab是如何决定分配新内存和复制的:将foo转换为struct将占用多少内存?换句话说,如果foo有一个1GB的字段,那么将其转换为struct会导致MATLAB消耗额外的GB内存吗?您如何估计Java对象的大小这些在Matlab中被报告为有0个字节…@Marc:将foo转换为struct不会占用太多内存。只转换结构本身。结构域的内容,包括假设的1GB域,将使用matlab的写时复制优化来共享。@Yair Altman:您需要调用Java代码来估计Java对象的大小,当isjava()表示您正在查看Java对象时,从matlab代码中调用它。没有标准的JavaSDK调用可以做到这一点。我使用了JavaWorld的“sizeof for Java”库(),上面有一个小小的M代码包装器。新的1.6 JVM可能有更好的工具,可以使用,可以从JVM中调用分析挂钩。我认为这对递归或嵌套句柄不起作用,但这是一个很好的建议
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              
    function total_mem = get_mem(obj) 
        %// Get all properties
        props = properties(obj); 

        total_mem = 0;
        %// Loop properties
        for ii=1:length(props)
            %// Make shallow copy
            curr_prop = obj.(props{ii});  %#ok<*NASGU>
            %// Get info struct for current property
            s = whos('curr_prop');
            %// Add to total memory consumption
            total_mem = total_mem + s.bytes; 
        end
    end
>> fprintf('%.1f MB in use.\n',do.sde.get_mem/1024^2)
7413.0 MB in use.