【问题标题】:Reading/writing HDF5 file in the same order it was created按照创建的顺序读取/写入 HDF5 文件
【发布时间】:2014-04-21 20:50:06
【问题描述】:

我正在使用 HDF5 文件对 C++ 类数据进行某种“序列化”。有没有办法让 HDF5 文件按照创建顺序访问每个数据集?

我选择 HDF5 是因为我需要从我的程序外部访问数据以及能够恢复我的程序状态。

谢谢!

【问题讨论】:

  • 但是 HDF5 文件在结构上是分层的(这就是 H 的意思)并且不会包含有关其内容写入顺序的信息,除非您将文件设计为包含该信息,显式或隐式。如果您确实以这种方式设计文件,那么您的问题肯定解决了。
  • 感谢惠普马克。我了解 HDF5 的层次结构,所以这是我想到的。不过,我在想,如果有可能在不添加额外元数据的情况下按创建顺序访问 group 的元素(现在缩小了范围),那就太好了。看来我得把这些属性写出来了。
  • 可能取决于组的crt_order_flags 的设置
  • 我会调查的。谢谢!

标签: c++ parallel-processing hdf5


【解决方案1】:

对我来说,能够按照创建顺序遍历组(可能还有其子组)中的数据集就足够了。为此,(如上面所说的 embert)必须使用 H5P_CRT_ORDER_TRACKED | 创建文件中的组。 H5P_CRT_ORDER_INDEXED 标志设置。也就是说,调用:

hid_t group_creation_plist;
group_creation_plist = H5Pcreate(H5P_GROUP_CREATE);
status = H5Pset_link_creation_order(group_creation_plist, 
                                 H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED);

然后使用以下方法创建组:

hid_t group_id;
group_id = H5Gcreate(id_file, 
                     "/mydata", 
                     H5P_DEFAULT, 
                     group_creation_plist, 
                     H5P_DEFAULT);

将所有数据添加到新组。要按排序的创建顺序遍历组,您必须使用H5Literate 函数,确保将index_type 参数设置为H5_INDEX_CRT_ORDER

    status = H5Literate (group_id, 
                         H5_INDEX_CRT_ORDER, // Note this argument
                         H5_ITER_INC, 
                         NULL, 
                         op_func,
                     (void *) &od);

从组开始迭代很重要,而不是从根开始。我无法使根组保持创建链接的顺序。解决这个问题的方法就是在根目录下创建一个带有适当标志的组。

使用H5Literate 有点棘手,特别是如果想要对子组进行递归遍历。在heredocumentation 中找到了一个很好的例子。

【讨论】:

猜你喜欢
  • 2022-07-07
  • 2013-09-25
  • 2017-09-23
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多