我在Matlab中保存和加载海量数据集时遇到问题。
我的数据集包含使用Matlab的regionprops
生成的一系列图像的属性。
我目前有一个大约21GB的MAT文件,需要一段时间才能加载。
该MAT文件具有一个单元格数组,其中包含每个切片上椭圆属性的结构数组。
关于如何解决这个问题,他们有什么建议吗? 是否有比-v7.3格式更好和有效的保存MAT文件的方法?
答案 0 :(得分:0)
一种解决方案是使用regionprops
的{{3}}参数。这将导致输出为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
数字数组是一种比struct数组更有效的数据存储方式,因为struct数组中的每个元素都是单独的矩阵,需要自己的标头。标头(我认为是114个字节)远大于数组中存储的值(本例中是8个字节),因此开销为31872 / 2112 = 15.1
。
该表将每个列存储在一个单独的数组中,因此您的开销要小得多。您只有3个数组,而不是3个88个数组(要素数量x对象数量)。
如果保证每个图像具有相同数量的对象,则可以考虑将这些矩阵放入单个3D数组而不是单元格数组中。这里的增益会较小。