评估HDF5:HDF5为建模数据提供了哪些限制/功能?

40

我们正在评估用于存储在对C/C++代码进行分析期间收集的数据的技术。对于C++而言,数据量可以相对较大,每个TU大约为20MB。

阅读了以下SO的答案之后,我认为HDF5可能是我们使用的合适技术。我想知道这里的人是否可以帮助我回答一些初始问题:

  1. 性能。通常用于数据的写入一次和“多次”读取,类似于编译器生成的“.o”文件的生命周期。 HDF5与使用SQLite DB之类的东西相比如何?是否做这样的比较是合理的?

  2. 随着时间的推移,我们将添加要存储的信息,但不一定希望重新分发完全新的“读者”来支持新格式。阅读了用户指南后,我了解到HDF5类似于XML或DB,即信息与标签/列相关联,因此构建用于读取旧结构的工具将仅忽略其不关心的字段?我的理解是否正确?

  3. 我们希望写出的信息的一大块将是树状结构:范围层次结构,类型层次结构等。理想情况下,我们应该将作用域建模为具有父项、子项等。是否可能让一个HDF5对象“指向”另一个对象?如果不行,是否有一种标准技术可以使用HDF5解决此问题?或者,就像在数据库中所需的那样,我们需要一个唯一的键,将一个对象与另一个对象“链接”,并在搜索数据时进行适当的查找?

非常感谢!

2个回答

23

HDF5与使用SQLite数据库相比如何?这是一个合理的比较吗?

有些相似但又不完全一样。它们都是结构化文件。SQLite具有支持使用SQL进行数据库查询的功能。HDF5具有支持大型科学数据集的功能。

它们都旨在实现高性能。

随着时间的推移,我们将添加要存储的信息,但不一定希望重新分发完全新的“读取器”来支持新格式。

如果以结构化形式存储数据,则这些结构的数据类型也存储在HDF5文件中。我对其工作原理有点生疏(例如是否包括本质上的向后兼容性),但我知道,如果设计您的“读取器”正确,它应该能够处理未来更改的类型。

是否可以使一个HDF5对象“指向”另一个对象?

当然可以!您需要使用attributes。每个对象都有一个或多个字符串描述到达该对象的路径。HDF5 groups类似于文件夹/目录,但文件夹/目录是分层的 = 每个文件夹/目录的位置都由唯一路径描述(至少在没有硬链接的文件系统中),而组成一个有向图,可以包括循环。我不确定是否可以直接将“指针”存储为属性,但您始终可以将绝对/相对路径作为字符串属性存储。(或任何其他地方作为字符串;如果您想要查找表,可以随时进行。)

10
我们在项目中生成HDF5数据,但通常我不直接处理它。 我可以尝试回答前两个问题:
  1. 我们使用一次写入,多次读取的模型,该格式似乎处理得很好。我知道一个项目曾经同时将数据写入Oracle数据库和HDF5。 最终,他们删除了Oracle输出,因为性能受到影响,并且没有人在使用它。 显然,SQLite不是Oracle,但HDF5格式更适合这项任务。 基于这一个数据点,关系型数据库可能更适合多个插入和更新。
  2. 我们的客户使用的读取器在添加新数据类型时非常强大。其中一些更改是预期的,但我们不必担心在添加更多数据字段时会破坏事情。我们的DBA最近编写了一个Python程序来读取HDF5数据并填充KMZ文件,以便在Google Earth中进行可视化。由于这是他用来学习Python的项目,所以我认为构建读取器并不难。
对于第三个问题,我会听从 Jason S的卓越知识
我认为选择HDF5是完全合理的选择,特别是如果您已经对它感兴趣或计划为科学界生产某些东西。

“科学界”是指什么?你有例子吗? - μολὼν.λαβέ

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