【发布时间】:2019-04-17 16:32:25
【问题描述】:
我在 Matlab 中保存和加载庞大的数据集时遇到问题。
我的数据集包含使用 Matlab 的regionprops 的一系列图像的属性。
我目前有一个大约 21GB 的 MAT 文件,这需要一段时间才能加载。
此 MAT 文件有一个元胞数组,其中包含每个切片上椭圆属性的结构体数组。
他们对如何解决这个问题有什么建议吗? 有没有比 -v7.3 格式更好更有效的保存 MAT 文件的方法?
【问题讨论】:
我在 Matlab 中保存和加载庞大的数据集时遇到问题。
我的数据集包含使用 Matlab 的regionprops 的一系列图像的属性。
我目前有一个大约 21GB 的 MAT 文件,这需要一段时间才能加载。
此 MAT 文件有一个元胞数组,其中包含每个切片上椭圆属性的结构体数组。
他们对如何解决这个问题有什么建议吗? 有没有比 -v7.3 格式更好更有效的保存 MAT 文件的方法?
【问题讨论】:
一种解决方案是使用'table' 参数到regionprops。这会导致输出为table 而不是结构数组。这种格式比struct数组存储效率更高。
更好的是,如果您不介意手动跟踪哪些数据在哪里,则可以使用相关数据创建一个数值数组:
BW = imread('text.png'); % Example image used in the docs
s = regionprops(BW,{'MajorAxisLength','MinorAxisLength','Orientation'});
t = regionprops('table',BW,{'MajorAxisLength','MinorAxisLength','Orientation'});
m = [s.MajorAxisLength; s.MinorAxisLength; s.Orientation];
whos
Name Size Bytes Class Attributes
BW 256x256 65536 logical
m 3x88 2112 double
s 88x1 31872 struct
t 88x3 3496 table
数值数组是一种比结构数组更有效的数据存储方式,因为结构数组中的每个元素都是一个单独的矩阵,需要有自己的标题。在这种情况下,标头(我相信是 114 字节)远大于存储在数组中的值(在这种情况下为 8 字节),因此会产生 31872 / 2112 = 15.1 的开销。
该表将每一列存储在一个单独的数组中,因此您的开销要小得多。您只有 3 个,而不是 3 x 88(特征数 x 对象数)数组。
如果保证每个图像具有相同数量的对象,您可以考虑将这些矩阵放入单个 3D 数组而不是元胞数组中。这里的收益会更小。
【讨论】:
regionprops 中的“功能”包含在 IMO 中是一个糟糕的设计决策。