matlab - 我怎么知道句柄对象在matlab中使用了多少内存

标签 matlab class object handle matlab-class

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

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

classdef foo < handle 
properties
    bar = randn(1000);
end

bar占用8兆字节(8字节*100万个数字)

但是如果我输入

obj = foo();
whos('obj');

我明白了

Name      Size            Bytes  Class    Attributes

  obj      1x1                60  foo                

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

最佳答案

作为 hack,将其转换为结构并查看占用了多少空间。我认为这将公开“常规”对象字段中的所有数据。

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

然后你可以在whos中看到它。

>> whos
  Name      Size              Bytes  Class     Attributes

  f         1x1                  60  foo                 
  s         1x1             8000124  struct       

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

如果您正在处理句柄对象,您可能在 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() 不会让您区分这些情况。处理这个很难;据我所知,执行此操作的唯一方法是使用 MEX 文件获取 mxarray 的数据指针并自己遍历对象树,检测别名指针并计算别名字节数。

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

关于matlab - 我怎么知道句柄对象在matlab中使用了多少内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2388409/

相关文章:

Matlab 中的 imagesc() 不显示等 Axis

java - 在 Java 中使用子抽象类

java - 如何使用Java中的线程每3秒创建一个对象?

javascript - 解析包含日期的 JSON 字符串时出现问题

matlab - 没有足够的输入参数继承Matlab

python - 从 numpy 直方图获取相等长度的数组或绘制不均匀数组

c++ - 如何从 C++ 中的 vector 容器中打印类指针?

c++ - 如何验证类方法签名?

javascript - 从变量内容创建对象属性

matlab - 使用 MATLAB 的 Gitlab CI