11

我发现写入和读取本机 mat 文件格式变得非常非常慢,数据结构约为 1G 大小。此外,我们还有其他非 matlab 软件应该能够读取和写入这些文件。所以我想找到一种替代格式来序列化matlab数据结构。理想情况下,这种格式将...

  1. 能够将任意 matlab 结构表示为文件。
  2. 比 mat 文件具有更快的 I/O。
  3. 拥有其他语言的 I/O 库,如 Java、Python 和 C++。
4

2 回答 2

18

简化数据结构并使用新的 v7.3 MAT 文件格式(HDF5 的变体)实际上可能是最好的方法。HDF5 格式是开放的,并且已经为您的其他语言提供了 I/O 库。并且根据您的数据结构,它们可能比旧的二进制 mat 文件更快。

  • 简化您正在保存的数据结构,更喜欢大型基元数组而不是复杂的容器结构。
  • 如果您的数据结构仍然很复杂,请尝试关闭压缩。
  • 使用“-v7.3”尝试 v7.3 MAT 文件格式
  • 如果使用网络文件系统,请考虑保存并加载到快速本地驱动器上的临时目录并复制到/从网络复制

对于大型数据结构,您的 MAT 文件 I/O 速度可能更多地取决于您正在写出的数据的内部结构,而不是生成的 MAT 文件本身的大小。(根据我的经验,这通常是导致 MAT 文件缓慢的主要因素。)当您说“任意 Matlab 结构”时,这表明您可能正在使用单元、结构或对象来制作复杂的数据结构。这会减慢 MAT I/O,因为 MAT 文件 I/O 中存在每个数组的开销,并且单元和结构数组(容器类型)的成员都算作单独的数组。例如,存储在 cellstr 中的 5,000 个字符串比存储在 2-D char 数组中的相同 5,000 个字符串要慢得多。对象的开销更大。作为测试,尝试写出一个 1 GB 的文件,其中仅包含一个 1 GB 的随机 uint8 原始数组,看看这需要多长时间。从那里,看看您是否可以简化数据以减少总 mxarray 计数,即使这意味着要对其进行整形以进行序列化。(我的经验主要是使用 v7 格式;较新的 HDF5 格式的每个元素开销可能更少。)

如果您的数据文件位于网络上,您还可以尝试对快速本地驱动器上的临时文件执行保存和加载操作,并单独使用复制操作在网络之间来回移动它们。至少在 Windows 网络上,我已经看到这样做的速度提高了 2 倍。可能由于优化,完整文件复制操作可以做到 MAT I/O 代码不能。

想出一种支持完全任意的 Matlab 数据结构并可以移植到其他语言的替代文件格式可能需要付出很大的努力。我会先尝试围绕您对现有格式的使用进行较小的更改。

于 2012-09-26T06:29:54.650 回答
3

mat 格式随 Matlab 版本而改变。v7.3 使用 HDF5 格式,具有内置压缩和其他功能,读取/写入可能需要大量时间。但是,您可以强制 Matlab 使用以前更快的格式(但可能会占用更多空间)。

看这里:

http://www.mathworks.com/help/matlab/import_export/mat-file-versions.html

于 2012-09-26T01:16:12.893 回答