【问题标题】:Loading huge cell array containing structures加载包含结构的巨大单元阵列
【发布时间】:2019-04-17 16:32:25
【问题描述】:

我在 Matlab 中保存和加载庞大的数据集时遇到问题。

我的数据集包含使用 Matlab 的regionprops 的一系列图像的属性。 我目前有一个大约 21GB 的 MAT 文件,这需要一段时间才能加载。
此 MAT 文件有一个元胞数组,其中包含每个切片上椭圆属性的结构体数组。

他们对如何解决这个问题有什么建议吗? 有没有比 -v7.3 格式更好更有效的保存 MAT 文件的方法?

【问题讨论】:

    标签: matlab mat-file


    【解决方案1】:

    一种解决方案是使用'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 数组而不是元胞数组中。这里的收益会更小。

    【讨论】:

    • 嗨 Cris,我会在后续运行中考虑到这一点。请注意,我还在数组中包含了 PixelIdxList 和 PixelList 等属性。由于数据已经存储为大小为 52GB 的结构数组,我将其转换为表数组,这将 .mat 文件的大小显着减少到约 21GB。那么在进一步操作表格单元数组以进一步减少内存大小方面有什么建议吗?
    • @obonuadaklu:是的,不包括像素列表。您最好保存标记的图像。将其作为 regionprops 中的“功能”包含在 IMO 中是一个糟糕的设计决策。
    猜你喜欢
    • 2011-05-01
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 2011-05-19
    • 2012-11-13
    相关资源
    最近更新 更多