Matlab的替代品';s Mat文件格式

Matlab的替代品';s Mat文件格式,matlab,Matlab,我发现,对于大约1G大小的较大数据结构,编写和读取本机mat文件格式变得非常缓慢。此外,我们还有其他非matlab的软件,应该能够读写这些文件。因此,我想找到一种替代格式,用于序列化matlab数据结构。理想情况下,这种格式将 能够将任意matlab结构表示为文件。 具有比mat文件更快的I/O。 有其他语言的I/O库,如java、python和C++。 mat格式随Matlab版本而改变。v7.3使用HDF5格式,该格式具有内置压缩和其他功能,读/写可能需要很长时间。但是,您可以强制Matla

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

  • 能够将任意matlab结构表示为文件。
  • 具有比mat文件更快的I/O。 有其他语言的I/O库,如java、python和C++。
    mat格式随Matlab版本而改变。v7.3使用HDF5格式,该格式具有内置压缩和其他功能,读/写可能需要很长时间。但是,您可以强制Matlab使用以前更快的格式(但可能占用更多空间)

    请看这里:


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

    • 简化正在保存的数据结构,与复杂的容器结构相比,更喜欢大型原语数组
    • 如果数据结构仍然复杂,请尝试关闭压缩
    • 使用“-v7.3”尝试v7.3 MAT文件格式
    • 如果使用网络文件系统,考虑保存和加载到本地本地驱动器上的临时DIR,并复制到/从网络< /LI>
    对于大型数据结构,MAT文件I/O速度可能更多地取决于正在写入的数据的内部结构,而不是结果MAT文件本身的大小。(根据我的经验,这通常是慢速MAT文件的主要因素。)当你说“任意Matlab结构”时,这表明你可能正在使用单元格、结构或对象来创建复杂的数据结构。这降低了MAT I/O的速度,因为MAT文件I/O中存在每个数组的开销,并且单元和结构数组(容器类型)的成员都算作单独的数组。例如,存储在cellstr中的5000个字符串比存储在二维字符数组中的5000个字符串慢得多。对象的开销甚至更大。作为测试,试着写出一个1GB文件,其中只包含一个1GB的随机UINT8基本数组,看看需要多长时间。在此基础上,查看是否可以简化数据以减少mxarray的总计数,即使这意味着要对其进行重新格式化以进行序列化。(我在这方面的经验主要是v7格式;较新的HDF5格式可能具有较少的每元素开销。)

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


    提出一种支持完全任意Matlab数据结构并可移植到其他语言的替代文件格式可能是一项巨大的努力。首先,我会尝试对现有格式的使用进行较小的更改。

    关于第二点,我想mat文件已经针对I/O速度进行了优化。例如,它们被压缩以最小化I/O。对于第三点,您可以使用
    -ascii
    格式保存,以使其可供任何其他程序读取,但速度会较慢。当您说“任意matlab结构”时,这些东西有多复杂?那会影响速度。正如Oli所说,MAT文件是压缩的,但压缩是在每个mxarray内部完成的,而不是整个文件,因此它实际上会降低复杂数据结构的I/O速度。@Andrew我们有结构数组,其中包含双精度数组。我们有双精度矩阵的结构,这些结构也有不同大小的单元数组。我还应该提到,这些文件大致有两种用例。一种是将它们加载到单独的工作站上,用于评估算法和科学目的。另一个用例是将海量数据从超级计算机移回最终存储数据的位置。请注意,v7.3不是默认格式,即使是较新版本的Matlab,v7.3之前的MAT文件也使用压缩。独立处理格式版本和压缩可能是必要的。@Andrew Janke实际上链接上说版本6不使用压缩。对,但版本7格式是默认格式,与基于HDF5的v7.3格式不同,它确实使用压缩。只是说V7.3格式不是唯一使用压缩的格式,如果OP检查他的文件格式并看到它是V7,他仍然需要考虑压缩。- 1。当速度瓶颈是I/O速度超过计算速度时(就像现在一样),压缩有助于更快地读取HDF5文件。特别是阅读速度的图表。@JasonS实际上,这只适用于阅读,因为解压在计算上几乎是微不足道的。压缩中的主要计算是在写的时候——看看你发布的链接中的写速度,有很大的不同。有趣的是,你提到了通过网络文件系统写文件。不幸的是,我们运行的许多机器都是超级计算机节点;它们没有任何类型的本地存储设备。已经做了一些工作来分解数据结构并转换为单精度。事实上,这是非常有益的。我看看你的其他建议会怎么样。