Matlab对象在.mat文件中占用大量空间。

5
我有一个来自我在Matlab中编写的某个类的对象。当我使用“whos”命令确定其大小时,它大约为720,000字节。当我将其保存在.mat文件中时,它需要大约75MB。发生了什么?
有没有一种有效的方法来在Matlab中保存和加载对象?
编辑:以下是属性及其大小列表
CT_COL: 2 p: 5 d: 10 n: 37 N: 20 idx: [20x1 double] Am: [4-D double] X: [4-D double] y: [37x1 double] KGram: [20x20 double] reWave: [] rpw: 2 grps: [1x37 double] exIDX: [1 4 5 6 13] nCV: 100 prIDX: [100x6 double] trIDX: [100x26 double] U: [5x100 double] V: [10x100 double] B: [20x100 double] Yhat: [37x100 double] Lam: [100x1 double] peakRatio: [37x1 double]
Am和X都是20x10x5x37数组(双精度)。
顺便说一下,“reWave”属性曾经保存另一个对象的方法的句柄。我认为这可能不是一个好主意(并且可能会导致这种情况),因此我已从类定义中删除了任何提及它的内容。但它似乎以某种方式出现在属性集中。(即使在我发出“clear classes”之后。)
编辑2:我正在使用命令 save('uvXbMod1.mat','ob') 仅保存对象。这里有一个令人困惑的地方:当我使用命令 whos -file uvXbMod1.mat 查看文件中保存了什么时,它显示
Name Size Bytes Class Attributes
ob 1x1 680512 uvXbModel
(这是另一个实例,而不是上面提到的那个。)还有什么其他东西被放入.mat文件中,使它变得如此巨大?
编辑3:好吧...问题似乎是我存储在两个受保护属性中的两个内联函数句柄。只有这两个, @(X) median(abs(X),2) @median 。句柄本身只有几个字节大小,我认为由于它们是内联函数,它们应该只与其一行定义一起作为文本存储(?)。但显然并非如此,它会导致大量其他内容被存储(事后看来似乎并不奇怪...)

1
你能更详细地描述一下这个对象吗?它是什么类型的,有什么尺寸? - Ryan J. Smith
2
这个对象看起来确实符合你报告的大约720 kB的描述。你是否可能保存了整个工作区而不仅仅是这个对象? - Ryan J. Smith
1
那些4D数组有多大? :) - Rody Oldenhuis
1
好的,如果你压缩这个文件,它会变成什么大小? - Rody Oldenhuis
1
感谢您的更新。我建议您将此作为“答案”发布到您的问题中;在一定时间后,您将能够“接受”它,并且它将帮助其他遇到相同问题的人找到您的解决方案! - Floris
显示剩余14条评论
1个回答

5
这是我在代码中发现的问题: 问题出在我存储在两个受保护属性中的两个内联匿名函数处理程序上。仅仅这两个,@(X) median(abs(X),2)@median
这些处理程序本身只有几个字节大小,我认为由于它们是内联匿名函数,它们应该只与其一行定义一起作为文本存储。但显然事实并非如此,并且会导致存储大量其他内容。

2
不是要挑剔,但这些是“匿名”而不是“内联”函数,这个区别在这个话题上很重要:匿名函数会捕获工作空间的副本,就像发生在你身上的那样,而内联函数则不会。但无论如何都要点赞。 - Andrew Janke
谢谢,问题已解决。我在想它们在速度方面的比较如何。我记得看过一篇帖子比较Matlab中各种函数调用的速度...。 - passerby51
1
你是指这篇帖子吗? ;) https://dev59.com/ynI-5IYBdhLWcg3wwLS3#1745686。我不知道内联函数在性能上如何比较。如果我没记错的话,它们曾经很慢,但现在它们可能会被编译成类似匿名函数的p-code。我不知道它们实际上是作为文本存储在内部并每次进行评估的;只是你提供它们作为文本,它们不捕获值。 - Andrew Janke
谢谢提供有用的链接...我想那就是它了。 - passerby51

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接