Matlab的Mat文件格式的替代方案

11

我发现当数据结构达到1G时,使用原生mat文件格式进行读写变得非常缓慢。此外,我们还有其他非Matlab软件需要读写这些文件。因此,我希望找到一种替代格式来序列化Matlab数据结构。理想情况下,这种格式应该:

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

对于你的第二点,我猜测mat文件已经针对I/O速度进行了优化。例如,它们被压缩以最小化I/O。对于你的第三点,你可以使用“-ascii”格式保存,使其可被任何其他程序读取,但这会变慢。 - Oli
当你说“任意的Matlab结构”时,这些东西有多复杂?这将影响速度。就像Oli所说,MAT文件是压缩的,但压缩是在每个mxarray内部完成的,而不是整个文件,因此对于复杂的数据结构,它实际上可能会减慢I/O速度。 - Andrew Janke
@Andrew 我们有包含双精度数组的结构体数组。我们还有包含双精度矩阵的结构体,这些结构体也有大小不同的单元格数组。我还应该提到这些文件大致有两种用例。一种是在个人工作站上加载它们以评估算法和进行科学研究。另一个用例只是将大量数据从超级计算机移回最终存储数据的地方。 - Sean McCauliff
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中存储的5000个字符串要比在2-D char数组中存储的相同5000个字符串慢得多,而对象则有更多的开销。作为测试,请尝试写出一个包含随机uint8的1GB原始数组的文件,并查看所需时间。从那里开始,即使这意味着需要重塑数据以进行序列化,也应尝试简化数据以减少总mxarray计数。(我对此的经验主要是使用v7格式;较新的HDF5格式可能具有更少的每个元素开销。)如果您的数据文件存储在网络上,您也可以尝试在快速本地驱动器上使用临时文件执行保存和加载操作,并单独使用复制操作在网络上移动它们。至少在Windows网络上,我曾看到过通过这样做获得2倍加速的情况。可能是由于全文件复制操作可以执行的优化,而MAT I/O代码无法执行。
设计支持完全任意的Matlab数据结构并且可移植到其他语言的备用文件格式可能需要相当大的工作量。我建议您先在现有格式的使用中尝试进行较小的更改。

你提到通过网络文件系统写出文件很有趣。不幸的是,我们运行的许多机器都是超级计算机节点;它们没有任何形式的本地存储设备。已经进行了一些工作来解构数据并转换为单精度。事实上,这非常有帮助。我会看看您的其他建议会发生什么。 - Sean McCauliff

3

1
请注意,即使对于较新版本的Matlab,v7.3也不是默认格式,并且早期的MAT文件也使用压缩。可能需要独立调整格式版本和压缩。 - Andrew Janke
@Andrew Janke,实际上链接中说版本6不使用压缩。 - Bitwise
没错,但是默认的版本7格式与基于HDF5的v7.3格式不同,前者使用了压缩。只是说v7.3格式并不是唯一使用压缩的格式,如果OP检查他的文件格式并发现它是v7,则仍然需要考虑压缩。 - Andrew Janke
当速度瓶颈是I/O速度而不是计算速度(就像现在这样),压缩可以帮助更快地读取HDF5文件。请参见http://www.pytables.org/docs/manual-2.2.1/ch05.html,特别是阅读速度图表。 - Jason S
@JasonS 实际上这只对读取数据时有效,因为解压几乎是计算简单的。压缩中的主要计算在写入时进行 - 查看您发布链接中的写入速度,会有很大的差别。 - Bitwise

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接