用于存储大型数据集的 HDF5 的强大替代方案

计算科学 数据结构 数据管理 数据存储
2021-12-02 06:21:46

在运行我的模拟时,我通常会得到典型大小为 10 GB 或更大的结果文件。它们包含数据类型为 float、double、complex float 和 complex double 的向量和矩阵。

最初我使用文本文件,但是当将每个模拟步骤的数据存储在文本文件中时,生成的文件数量增加得非常快。因此,我转而使用 HDF5。它具有以下优点:

  • 我将所有结果都放在一个文件中,而不是像文本文件那样分发
  • 我可以在存储的数据旁边存储属性和元数据,描述内容和使用的参数
  • 我可以构建我的数据,这样我就可以像在文件系统中一样浏览它。相关数据保持紧密,我不必x-axis在一个地方为我的数据,t-axis在一个完全不同的地方,以及在第三个地方的相应矩阵。这使得处理非常简单
  • 我可以通过 Matlab、Python、C/C++ 和其他几种语言访问数据
  • 我可以(理论上)并行写入数据,但目前没有必要

但是,这种文件格式有几个缺点(txt 文件不存在):

  • 打开文件而不正确关闭它会损坏它,并可能使其无法使用(在最坏的情况下)
  • 写入文件并达到硬盘配额会损坏文件,使其完全无法使用。

简而言之,文件非常容易损坏,如果相应的模拟需要数周才能运行,并且没有可用的备份,这可能会特别痛苦。

具有此处列出的优势,并且比 HDF5 更强大,我还有哪些其他替代方案?这个问题可能与其他问题有关(存储分层模拟数据的最佳实践hdf5 的替代方案),并且提出了 XML 或 ADIOS 等替代方案,但我还没有找到最终结论。

2个回答

我认为你在你的缺点清单上过于重视了。例如,如果您运行到磁盘空间限制,是否(i)一半数据丢失只是因为它无法写入,或者(ii)所有数据丢失,因为文件被破坏了?在任何一种情况下,您都没有运行模拟的数据,因此必须再次运行。如果您预计磁盘空间不足是一个问题,并确保“最重要的数据部分”首先写入.txt文件,您可以通过使用多个.h5文件,但实际上我认为您无法合理地处理磁盘空间不足的情况,因为您无法预测将写入数据的哪些部分以及写入将失败的部分:这只是一种脆弱的方法out 在实践中不是很有用。

“打开文件而不正确关闭它”是任何类型的文件的问题。编程语言支持库和操作系统都将始终缓冲写入,并且您从未正确关闭的文件中读取的任何内容在任何情况下都是不可靠的。因此,您应该使用使这成为不可能的编程实践。例如,在 C++ 中,您将使用在您离开代码块时关闭文件的std::ofstream类(例如,通过其析构函数的类),并且您应该使用类似的类来写入 HDF5 文件。在所有现代编程语言中都可以使用相同类型的机制(我不会将 C 或大多数人今天使用的 Fortran 变体计算在内)。

换句话说,我相信你给HDF5的优点都是真实的,而缺点不是。

您是否看过(并行) NetCDF但是,我不确定是否对您提到的问题进行了处理,这在所有平台和接口上都得到了保证。