poster
2019-12-10, 20:30
如果我声明一个对象为handle classdef obj > 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); sx = x; sy = x; sz = 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语言,而是使用指向任意内存块的指针。
更多&回答... (https://stackoverflow.com/questions/2388409)
如果使用的是句柄对象,则可能在M代码级别具有别名甚至循环引用,因此在递归时需要注意这一点。 (对不起,我不知道如何在新的OO系统中处理该问题。)
Whos中的内存显示还将对通过Matlab的写时复制优化共享内存的数组进行两次计数。这是一个具体的例子。
x = NaN(1,10000); sx = x; sy = x; sz = 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语言,而是使用指向任意内存块的指针。
更多&回答... (https://stackoverflow.com/questions/2388409)