【问题标题】:Matlab object takes a large space in a .mat fileMatlab 对象在 .mat 文件中占用很大空间
【发布时间】:2013-04-25 03:09:59
【问题描述】:

我有一个我在 Matlab 中编写的类的对象。当我使用“whos”命令来确定它的大小时,它大约是 720,000 字节。当我将它保存在 .mat 文件中时,大约需要 75MB。到底是怎么回事?

在 Matlab 中是否有一种保存和加载对象的有效方法?

编辑:这是属性及其大小的列表

CT_COL:2 人:5 d: 10 n: 37 数量:20 idx:[20x1 双] 上午:[4-D双] X:[4-D双] y:[37x1 双] 公斤:[20x20 双倍] 回波:[] 转速:2 grps:[1x37 双] exIDX:[1 4 5 6 13] nCV:100 prIDX:[100x6 双倍] trIDX:[100x26 双倍] U:[5x100 双] 五:[10x100双] B:[20x100 双倍] Yhat:[37x100 双倍] 林:[100x1 双] 峰值比率:[37x1 双倍]

Am 和 X 都是 20x10x5x37 数组(双精度)

顺便说一句,属性“reWave”用于保存另一个对象的方法的句柄。我认为这可能不是一个好主意(并且可能导致这种情况),所以我从类定义中删除了任何提及它的内容。但它似乎以某种方式出现在属性集中。 (即使在我发布了“clear classes”之后。)

EDIT2:我使用命令 save('uvXbMod1.mat','ob') 只保存对象。令人费解的是:当我使用命令 whos -file uvXbMod1.mat 查看文件中保存的内容时,它显示了

名称大小字节类属性 ob 1x1 680512 uvXbModel

(这是另一个例子,不是上面提到的那个。).mat 文件中还有什么使它变得那么大?

EDIT3:好的...问题似乎是我存储在两个受保护属性中的两个内联函数句柄。只有这两个, @(X) median(abs(X),2) @median 。句柄本身只有几个字节大小,我假设由于它们是内联函数,它们应该与它们的单行定义一起存储为文本 (?)。但显然这并没有发生,它会导致大量其他东西被存储起来(事后这似乎并不奇怪......)

【问题讨论】:

  • 您能否对对象进行更多描述?它的类型和尺寸是什么?
  • 该对象绝对与您报告的 720 kB 左右一致。您是否可以保存整个工作区而不仅仅是这个对象?
  • 您使用的保存命令是什么?它应该类似于save('myfile.mat', 'myobject')。如果您不使用第二个参数,那么正如@RyanJ.Smith 所建议的那样,您将节省整个工作空间 - 很容易达到 75M。 .mat 文件通常比whos 报告的大小小得多,因为它是经过压缩的。
  • 这些 4D 数组有多大? :)
  • 恐怕如果无法重现该问题,我们将无济于事。我建议共享代码或联系 TMW 支持以保留隐私。

标签: matlab


【解决方案1】:

这是我在代码中发现的问题: 问题是我存储在两个受保护属性中的两个 inline 匿名函数句柄。只有这两个,@(X) median(abs(X),2)@median

句柄本身只有几个字节大小,我假设由于它们是 inline 匿名函数,它们应该与它们的单行定义一起存储为文本。但显然这不会发生,它会导致大量其他东西被一起存储。

【讨论】:

  • 再一次,不要吹毛求疵,但这些是“匿名”,而不是“内联”函数,并且与这个主题相关的区别很重要:匿名函数将捕获工作空间的副本,就像发生在你身上一样,而内联函数不会。但无论如何 +1。
  • 谢谢,已修复。我想知道它们在速度方面的比较。我记得看到一篇文章比较了 Matlab 中各种函数调用的速度...... .
  • 你是说这个帖子吗? ;)stackoverflow.com/questions/1693429/…。我不知道内联函数如何比较性能。 IIRC 它们曾经很慢,但现在它们可能会被编译成 p 代码,就像匿名函数一样。我不知道它们实际上在内部存储为文本并每次都进行评估;只是您将它们作为文本提供并且它们不捕获值。
  • 感谢您提供有用的链接...我想就是这样。
猜你喜欢
  • 2020-03-14
  • 2020-03-23
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
  • 2015-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多