在Julia中写入HDF5文件中的复合表并将其追加

在Julia中写入HDF5文件中的复合表并将其追加,julia,hdf5,Julia,Hdf5,如何将数据写入HDF5中的复合表,并将其追加到具有可变长度字符串的列和各种标准类型(Int64、Float64、Bool)的其他列中 基本知识以某种形式存在于朱莉娅身上。使用HDF5组的C接口并编写完全在Julia中实现的自定义HDF5文件,但我还没有找到创建、写入和附加到此类复合表的方法 我的目标是要有一个文件,其中存储的数据,从一些仪器,这是明确的注释。随着更多的数据进入,它将定期附加到这些HDF5文件中。需要一个二进制文件来将文件保持在可管理的大小,并且需要一个通用标准来实现我们组中使用的

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

基本知识以某种形式存在于朱莉娅身上。使用HDF5组的C接口并编写完全在Julia中实现的自定义HDF5文件,但我还没有找到创建、写入和附加到此类复合表的方法


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

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

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

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

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

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

HDF5用户指南位于此处:

你在问一个复杂的问题。我知道一个部分,附加到HDF5数据集,但我从未在HDF5中使用复合类型或可变长度字符串。你能用这些文件走多远?您可以使用可变长度字符串创建复合数据类型吗?您是否确实知道这是可能的(例如,您能用python实现它)?我不确定HDF5中的可扩展数据集是否适用于可变长度字符串。1)很明显,HDF5文件绝不是数据库。然而,专栏这个词很有描述性,也很贴切。由于没有更好的选择,它们仍然是我写的任何文章中的专栏。2) 异构数据对于HDF5文件来说并不是问题,尽管我理解您的点具有可变长度字符串。我们收集的一些数据有时确实需要它们,所以我的问题是指我们需要的最坏情况。不用说,单独的仪器,尤其是具有不同测量频率的数据流,应该在单独的数据集中。我非常了解HDF5集团的文档,并考虑到我的需要来阅读。此外,我还深入研究了HDF5.jl、JLD2.jl和HDF5组的C示例源代码,以找到答案。答案很可能在于其中任何一个,但我要么错过了,要么误解了。这个C示例基本上就是我想要做的,但到目前为止,我还无法在Julia中复制它,即使使用HDF5.jl的低级函数。添加数据对我来说是一个困惑点,因为文档似乎表明,只有通过创建新表或使用分块数据集才能添加数据。我首先在Labview中做了一些测试,在那里似乎可以一次添加任意多的行。使用命名集群甚至为列提供了有用的名称,这使得查看字段中的数据集变得更加容易。它可能只是一行的块大小,所以看起来它支持附加数据,但我真的不知道Labview HDF5包的开发人员是如何实现它的。是的,您只能扩展块数据集。在C API中,使用H5Dcreate创建数据集,传入的数据空间需要在要扩展的维度中将其最大大小设置为H5S_UNLIMITED。然后调用H5Dset_extent来更改数据集的大小。注意块大小——非常小的块大小将生成大量的文件元数据,性能将急剧下降。请看这里: