【问题标题】:Writing and appending to a compound table in an HDF5 file in Julia在 Julia 中写入并附加到 HDF5 文件中的复合表
【发布时间】:2017-11-10 14:14:59
【问题描述】:

如何将数据写入和附加到 HDF5 中的复合表,其中包含可变长度字符串列和其他各种标准类型(Int64、Float64、Bool)的列?

基础知识以某种形式存在于 Julia 中。 HDF5.jl 使用 HDF5 Group 的 C 接口,JLD2.jl 编写完全在 Julia 中实现的自定义 HDF5 文件,但我还没有找到创建、写入和附加到这样一个复合表的方法。

我的目标是创建一个文件,该文件存储来自许多仪器的数据,并带有清晰的注释。随着更多数据的进入,它将定期附加到这些 HDF5 文件中。需要一个二进制文件来将文件保持在可管理的大小,并且需要一个通用标准来实现我们组中使用的编程语言之间的可移植性。数据库不适合我们的用例。

【问题讨论】:

  • 您在问一个复杂的问题。我知道一部分,附加到 HDF5Datasets,但我从未在 HDF5 中使用过复合类型或可变长度字符串。你能在文档中走多远?你能用可变长度字符串制作复合数据类型吗?您确定这是可能的吗(例如,您可以在 python 中做到这一点)吗?我不确定 HDF5 中的可扩展数据集是否适用于可变长度字符串。

标签: julia hdf5


【解决方案1】:

我认为您将能够做您想做的事,但我认为对您来说最好的方法可能是阅读 HDF5 用户指南以了解 HDF5 的工作原理。此处发布的问题非常广泛,类似于问“如何在关系数据库中存储数据?”

不过,有几件事可以为您指明正确的方向:

  • HDF5 不是关系数据库,即使 PyTables 将表格界面映射到 HDF5,引用 HDF5 表和列在语义上也是不正确的。相反,有可以存储特定类型元素的 HDF5 数据集。这些元素可以是复合类型,大致相当于 C 结构,并且具有 1 个或多个字段,这些字段也是特定类型。

  • 如果您想存储异构数据,您可能需要多个数据集。如果您有多种仪器,特别是如果它们具有不同的数据速率,我可能会将它们的数据存储在不同的数据集中。您可能还可以使用具有巨大复合类型的巨型数据集来存储您所有仪器的所有数据,但这几乎肯定会很笨拙,性能更差,而且也不能压缩。

  • 我会避免使用 HDF5 可变长度类型。它们使用起来很尴尬,数据无法压缩,并且性能很差,因为它们破坏了局部性(数据集只存储对单独文件位置的引用,其中保存了真实数据)。相反,请考虑通过连接数据并将单独的索引数据集存储到连接数据集的开始/结束点中,或者通过存储足够大以容纳典型数据的固定数量的数据点来扁平化您的数据。例如,如果您需要存储长度永远不会超过 100 个字符的字符串,只需创建一个 n x 100 数据集,压缩可能会处理额外的空值。大多数认为他们需要 HDF5 可变长度类型的人实际上并不需要可变长度类型。事实上,我想说的是,大多数刚接触 HDF5 并询问 vlen 类型的人实际上只需要可扩展的数据集。

HDF5 用户指南位于此处: https://support.hdfgroup.org/HDF5/doc/index.html

【讨论】:

  • 1) 很明显 HDF5 文件绝不是数据库。然而,术语列是非常具有描述性和贴切性的。由于缺乏更好的选择,它们仍然是我写的任何东西的专栏。 2)虽然我理解你对可变长度字符串的看法,但异构数据对于 HDF5 文件来说不是问题。我们的一些数据收集有时确实需要它们,所以我的问题是指我们需要的最坏情况。不用说,不同的仪器,尤其是具有不同测量频率的数据流应该在不同的数据集中。
  • 我非常了解 HDF5 Group 的文档,并且考虑到了我的需求。另外我翻遍了HDF5.jl、JLD2.jl,以及HDF5 Group的C示例源代码来寻找答案。答案很可能在于其中任何一个,但我要么错过了它,要么误解了它。这个 C 示例基本上是我想要做的,但到目前为止我还无法在 Julia 中复制它,即使使用 HDF5.jl 的低级函数也是如此。 support.hdfgroup.org/ftp/HDF5/examples/misc-examples/…
  • 附加数据对我来说一直是一个困惑点,因为文档似乎表明它只能通过创建新表或使用分块数据集来实现。我首先在 Labview 中做了一些测试,似乎我可以一次添加尽可能多的行。使用命名集群甚至为列提供了有用的名称,这使得在该领域中查看数据集变得更加容易。可能只是一行的块大小,所以它似乎支持附加数据,但我真的不知道 Labview HDF5 包的开发人员是如何实现它的。
  • 是的,您只能扩展分块数据集。在 C API 中,您使用 H5Dcreate 创建数据集,并且您传入的数据空间需要将其在您要扩展的维度中的最大大小设置为 H5S_UNLIMITED。然后调用 H5Dset_extent 来更改数据集的大小。注意你的块大小——一个非常小的块大小会产生大量的文件元数据,性能会直线下降。见这里:support.hdfgroup.org/ftp/HDF5/examples/introductory/C/…
猜你喜欢
  • 2021-10-26
  • 2017-10-02
  • 1970-01-01
  • 2020-09-13
  • 2022-07-07
  • 2018-04-18
  • 1970-01-01
  • 2013-03-01
  • 2011-04-03
相关资源
最近更新 更多