加载包含结构的巨大元胞数组
Loading huge cell array containing structures
我在 Matlab 中保存和加载庞大的数据集时遇到问题。
我的数据集包含使用 Matlab regionprops
的一系列图像的属性。
我目前有一个大约 21GB 的 MAT 文件,这需要一段时间才能加载。
此 MAT 文件有一个元胞数组,其中包含每个切片上椭圆属性的结构数组。
他们对如何解决这个问题有什么建议吗?
有没有比 -v7.3 格式更好更有效的 MAT 文件保存方式?
一种解决方案是使用 regionprops
的 'table'
参数。这导致输出为 table
而不是结构数组。这种格式比结构数组更有效地存储。
更好的是,如果您不介意手动跟踪哪些数据在哪里,可以创建一个包含相关数据的数值数组:
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
数值数组是一种比结构数组更有效的数据存储方式,因为结构数组中的每个元素都是一个单独的矩阵,需要自己的矩阵 header。 header(我相信是 114 个字节)在这种情况下远大于存储在数组中的值(在这种情况下是 8 个字节),因此 31872 / 2112 = 15.1
.
的开销
table 将每一列存储在一个单独的数组中,因此您的开销要小得多。您没有 3 x 88(特征数 x objects)数组,而是只有 3.
如果保证每张图片都有相同数量的objects,您可以考虑将这些矩阵放入单个 3D 数组而不是元胞数组中。这里的增益会小一些。
我在 Matlab 中保存和加载庞大的数据集时遇到问题。
我的数据集包含使用 Matlab regionprops
的一系列图像的属性。
我目前有一个大约 21GB 的 MAT 文件,这需要一段时间才能加载。
此 MAT 文件有一个元胞数组,其中包含每个切片上椭圆属性的结构数组。
他们对如何解决这个问题有什么建议吗? 有没有比 -v7.3 格式更好更有效的 MAT 文件保存方式?
一种解决方案是使用 regionprops
的 'table'
参数。这导致输出为 table
而不是结构数组。这种格式比结构数组更有效地存储。
更好的是,如果您不介意手动跟踪哪些数据在哪里,可以创建一个包含相关数据的数值数组:
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
数值数组是一种比结构数组更有效的数据存储方式,因为结构数组中的每个元素都是一个单独的矩阵,需要自己的矩阵 header。 header(我相信是 114 个字节)在这种情况下远大于存储在数组中的值(在这种情况下是 8 个字节),因此 31872 / 2112 = 15.1
.
table 将每一列存储在一个单独的数组中,因此您的开销要小得多。您没有 3 x 88(特征数 x objects)数组,而是只有 3.
如果保证每张图片都有相同数量的objects,您可以考虑将这些矩阵放入单个 3D 数组而不是元胞数组中。这里的增益会小一些。