按创建顺序读写HDF5文件

3
我正在使用HDF5文件对C++类数据进行一种“序列化”。有没有一种方法可以遍历HDF5文件,按照创建顺序访问每个数据集?
我选择HDF5是因为我需要从程序外部访问数据,并能够恢复程序状态。
谢谢!

但是,HDF5文件具有分层结构(这就是H的含义),除非您设计文件以包含该信息(明确或隐含地),否则它不会包含有关其内容编写顺序的信息。如果您以这种方式设计文件,那么您的问题肯定得到解决。 - High Performance Mark
谢谢HP Mark。我理解HDF5的分层结构,所以这是我想到的一些内容。不过,我在想是否有可能在不添加额外元数据的情况下按创建顺序访问_group_(现在缩小了范围)的元素,这将是很好的。看起来我必须写出那些属性。 - ja.abell
可能取决于组的crt_order_flags设置。 - embert
我会调查一下。谢谢! - ja.abell
1个回答

3

对我来说,能够按照创建顺序遍历数据集组(及其子组)就足够了。为了实现这一点(正如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有些棘手,特别是如果想要递归遍历子组。可以在这里文档中找到一个很好的例子。

1
你会如何使用C++接口来实现它? - user877329
对于那些尝试使用属性进行相同操作的人:你会自己给自己惹麻烦,因为 H5Acreate2 中会忽略 acpl_id 参数: https://portal.hdfgroup.org/display/HDF5/H5A_CREATE2 - user14717

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接