【问题标题】:Evaluating HDF5: What limitations/features does HDF5 provide for modelling data?评估 HDF5:HDF5 为数据建模提供了哪些限制/功能?
【发布时间】:2010-10-07 12:38:22
【问题描述】:
我们正在评估用于存储在分析 C/C++ 代码期间收集的数据的技术。在 C++ 的情况下,数据量可能比较大,每个 TU 大约 20Mb。
阅读以下 SO answer 后,我认为 HDF5 可能是适合我们使用的技术。我想知道这里的人是否可以帮助我回答我的一些初步问题:
性能。数据的一般用法是写入一次并读取“多次”,类似于编译器生成的“.o”文件的生命周期。 HDF5 与使用 SQLite DB 之类的东西相比如何?这是否是一个合理的比较?
随着时间的推移,我们将添加到我们存储的信息中,但不一定要重新分发一组全新的“阅读器”来支持新格式。阅读用户指南后,我了解到 HDF5 类似于 XML 或 DB,因为该信息与标签/列相关联,因此为读取旧结构而构建的工具只会忽略它不关心的字段?我对此的理解正确吗?
我们希望写出的大部分信息将是树型结构:范围层次结构、类型层次结构等。理想情况下,我们会将范围建模为具有父级、子级等。是否有可能一个 HDF5 对象“指向”另一个?如果没有,是否有使用 HDF5 解决此问题的标准技术?或者,根据数据库的要求,我们是否需要一个唯一键,以便在搜索数据时通过适当的查找将一个对象“链接”到另一个对象?
非常感谢!
【问题讨论】:
标签:
database
binaryfiles
hdf5
datamodel
【解决方案1】:
HDF5 与使用 SQLite DB 之类的东西相比如何?
这是一个合理的比较吗?
有点相似,但不是真的。它们都是结构化文件。 SQLite 具有支持使用 SQL 进行数据库查询的功能。 HDF5 具有支持大型科学数据集的功能。
它们都意味着高性能。
随着时间的推移,我们将添加到我们正在存储的信息中,但不一定要重新分发一组全新的“阅读器”以支持新格式。
如果您以结构化形式存储数据,那么这些结构的数据类型也会存储在 HDF5 文件中。我对它的工作原理有点生疏(例如,如果它包括先天的向后兼容性),但我知道如果你正确设计你的“阅读器”,它应该能够处理未来改变的类型。
是否可以让一个 HDF5 对象“指向”另一个?
绝对!你会想要使用attributes。每个对象都有一个或多个字符串描述到达该对象的路径。 HDF5 groups 类似于文件夹/目录,除了文件夹/目录是分层的 = 一个唯一路径描述每个人的位置(至少在没有硬链接的文件系统中),而组形成一个可以包括循环的有向图。我不确定您是否可以将指向对象的“指针”直接存储为属性,但您始终可以将绝对/相对路径存储为字符串属性。 (或任何其他地方作为字符串;如果需要,您可以拥有大量的查找表。)
【解决方案2】:
我们在我的项目中生成 HDF5 数据,但我通常不直接处理它。我可以试一下前两个问题:
我们使用一次写入,多次读取模型,该格式似乎处理得很好。我知道一个项目用于写入 Oracle 数据库和 HDF5。最终他们删除了 Oracle 输出,因为性能受到影响并且没有人使用它。显然,SQLite 不是 Oracle,但 HDF5 格式更适合这项任务。基于这一数据点,RDBMS 可能会针对多次插入和更新进行更好的调整。
当我们添加新的数据类型时,我们的客户使用的阅读器非常强大。一些变化是预料之中的,但我们不必担心在添加更多数据字段时会破坏东西。我们的 DBA 最近编写了一个 Python 程序来读取 HDF5 数据并填充 KMZ 文件以在 Google 地球中进行可视化。既然是他用来学习Python的项目,我想说培养阅读器并不难。
关于第三个问题,我向Jason S's superior knowledge鞠躬。
我会说 HDF5 是一个完全合理的选择,特别是如果您已经对它感兴趣或计划为科学界生产一些东西。