【问题标题】:Alternatives to Matlab's Mat File FormatMatlab Mat 文件格式的替代品
【发布时间】:2012-09-17 13:41:09
【问题描述】:

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

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

【问题讨论】:

  • 第二点,我猜 mat 文件已经针对 I/O 速度进行了优化。例如,它们被压缩以最小化 I/O。对于您的第三点,您可以使用-ascii 格式保存,以使其可以被任何其他程序读取,但它会更慢。
  • 当你说“任意matlab结构”时,这些东西有多复杂?那会影响速度。正如 Oli 所说,MAT 文件是经过压缩的,但压缩是在每个 mxarray 内部完成的,而不是整个文件,因此它实际上会降低复杂数据结构的 I/O 速度。
  • @Andrew 我们有结构数组,其中包含双精度数组。我们有带有双精度矩阵的结构,这些结构也有不同大小的元胞数组。我还应该提到这些文件大致有两种用例。一种是将它们加载到单个工作站上,以评估算法和用于科学目的。另一个用例只是将批量数据从超级计算机移回最终存储数据的位置。

标签: matlab


【解决方案1】:

简化数据结构并使用新的 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 数据结构并可以移植到其他语言的替代文件格式可能需要付出很大的努力。我会先尝试围绕您对现有格式的使用进行较小的更改。

【讨论】:

  • 有趣的是,您提到通过网络文件系统写出文件。不幸的是,我们运行的许多机器都是超级计算机节点。这些没有任何类型的本地存储设备。已经做了一些工作来解构数据并转换为单精度。确实,这非常有帮助。我会看看你的其他一些建议会发生什么。
【解决方案2】:

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

看这里:

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

【讨论】:

  • 请注意,v7.3 不是默认格式,即使对于较新版本的 Matlab,v7.3 之前的 MAT 文件也使用压缩。可能需要独立摆弄格式版本和压缩。
  • @Andrew Janke 实际上链接说版本 6 不使用压缩。
  • 是的,但是版本 7 格式是默认格式,与基于 HDF5 的 v7.3 格式不同。只是说v7.3格式不是唯一使用压缩的格式,如果OP检查他的文件格式并看到它是v7,他仍然需要考虑压缩。
  • -1。当速度瓶颈是 I/O 速度超过计算速度时(就像现在一样),压缩有助于更快地读取 HDF5 文件。请参阅pytables.org/docs/manual-2.2.1/ch05.html,尤其是读取速度图。
  • @JasonS 实际上这仅适用于阅读,因为解压缩在计算上几乎是微不足道的。压缩的主要计算是在写的时候——看你贴的链接里的写速度,差别很大。
猜你喜欢
  • 2011-10-26
  • 1970-01-01
  • 2015-07-21
  • 1970-01-01
  • 2020-03-24
  • 1970-01-01
  • 2012-06-29
  • 2014-03-27
  • 2015-08-14
相关资源
最近更新 更多