我们正在评估用于存储在 C/C++ 代码分析过程中收集的数据的技术。对于 C++,数据量可能相对较大,每个 TU 约为 20Mb。

阅读以下内容后 回答 这让我考虑到 HDF5 可能是适合我们使用的技术。我想知道这里的人是否可以帮助我回答我的一些初步问题:

  1. 表现。数据的一般用法是写入一次并读取“几次”,类似于编译器生成的“.o”文件的生命周期。HDF5 与使用 SQLite DB 之类的东西相比如何?这是一个合理的比较吗?

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

  3. 我们希望写出的信息的很大一部分将是树类型的结构:范围层次结构、类型层次结构等。理想情况下,我们将范围建模为有父母、孩子等。是否可以让一个 HDF5 对象“指向”另一个对象?如果没有,是否有标准技术可以使用 HDF5 解决此问题?或者,正如数据库中所要求的那样,我们是否需要一个唯一的键,在搜索数据时通过适当的查找将一个对象“链接”到另一个对象?

非常感谢!

有帮助吗?

解决方案

HDF5 与使用 SQLite DB 之类的东西相比如何?这是一个合理的比较吗?

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

它们都意味着高性能。

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

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

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

绝对地!你会想要使用 属性. 。每个对象都有一个或多个字符串来描述到达该对象的路径。HDF5 团体 类似于文件夹/目录,不同之处在于文件夹/目录是分层的=唯一的路径描述每个文件夹/目录的位置(至少在没有硬链接的文件系统中),而组形成可以包含循环的有向图。我不确定是否可以将指向对象的“指针”直接存储为属性,但您始终可以将绝对/相对路径存储为字符串属性。(或其他任何地方作为字符串;如果你愿意的话,你可以拥有大量的查找表。)

其他提示

我们在我的项目中生成HDF5数据,但我通常不直接处理它。我可以回答前两个问题:

  1. 我们使用一次写入,多次读取的模型,并且该格式似乎可以很好地处理这个问题。我知道一个项目曾经将两者写入 甲骨文 数据库和 HDF5。最终他们删除了 Oracle 输出,因为性能受到影响并且没有人使用它。显然,SQLite 不是 Oracle,但 HDF5 格式更适合该任务。基于这一数据点,RDBMS 可以针对多次插入和更新进行更好的调整。

  2. 当我们添加新数据类型时,我们的客户使用的阅读器非常强大。有些变化是预料之中的,但我们不必担心在添加更多数据字段时会破坏事物。我们的 DBA 最近编写了一个 Python 程序来读取 HDF5 数据并填充 KMZ 文件以在 Google Earth 中进行可视化。由于这是他用来学习Python的一个项目,所以我想说培养读者并不难。

关于第三个问题,我会鞠躬 Jason S 的卓越知识.

我认为 HDF5 是一个完全合理的选择,特别是如果您已经对它感兴趣或计划为科学界生产一些东西。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top