Armadillo:在一个hdf5文件中保存多个数据集

Armadillo: Save multiple datasets in one hdf5 file

本文关键字:文件 保存 数据集 hdf5 Armadillo 一个      更新时间:2023-10-16

我正试图使用armadillo的新功能将多个数据集保存到一个hdf5文件中,为数据集提供自定义名称(使用armadillio版本8.100.1)。但是,只有最后保存的数据集才会出现在文件中。有没有办法用armadillo附加到现有的hdf5文件中,而不是替换它?

这是我的示例代码:

#define ARMA_USE_HDF5
#include <armadillo>
int main(){
arma::mat A(2,2, arma::fill::randu);
arma::mat B(3,3, arma::fill::eye);
A.save(arma::hdf5_name("multi-hdf5.mat", "dataset1"), arma::hdf5_binary);
B.save(arma::hdf5_name("multi-hdf5.mat", "dataset2"), arma::hdf5_binary);
return 0;
}

使用h5dump实用程序读取hdf5文件。

不幸的是,我认为你做不到。我是一个HDF5开发人员,不是一个armadillo开发人员,但我为您看了一眼他们的源代码。

保存函数看起来像是将单个矩阵转储到单个文件中。在函数save_hdf5_binary()(一个版本为diskio_meat.hpp:1255)中,他们使用H5F_ACC_TRUNC标志调用H5Fcreate(),这将阻塞任何现有文件。没有"如果文件存在则打开"或clobber/nonclobber选项。唯一的H5Fopen()调用在hdf5_binary_load()函数中,这些调用不会保持文件打开以备以后写入。

这种破坏就是在您的情况下发生的情况,顺便说一句,A.save()创建了一个包含数据集1的文件,然后B.save()用包含数据集2的新文件破坏该文件。

此外,就其价值而言,"附加到HDF5文件"并不是真正正确的思考方式。HDF5文件不像文本文件那样是字节/字符流。附加到数据集,是的。文件,不是。把它想象成一个关系数据库:你可能会把数据附加到一个表中,但你可能不会说你把数据附加在数据库中。

最新版本的Armadillo已经涵盖了这种可能性。您必须在保存方法中使用hdf5_opts::append,因此如果要保存矩阵a,然后你可以写A.save(hdf5_name(filename, dataset, hdf5_opts::append) )