40

我们正在评估用于存储在分析 C/C++ 代码期间收集的数据的技术。在 C++ 的情况下,数据量可能比较大,每个 TU 约 20Mb。

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

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

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

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

非常感谢!

4

2 回答 2

23

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

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

它们都意味着高性能。

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

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

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

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

于 2009-02-13T19:07:35.030 回答
10

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

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

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

关于第三个问题,我要向Jason S 的高超知识低头。

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

于 2009-02-13T19:45:59.323 回答