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

Armadillo: Save multiple datasets in one hdf5 file

我正在尝试使用犰狳的新功能将多个数据集保存到单个 hdf5 文件中,以便为数据集提供自定义名称(使用犰狳版本 8.100.1)。 但是,只有最后保存的数据集才会出现在文件中。有没有办法用犰狳附加到现有的 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 开发人员,不是犰狳开发人员,但我为您浏览了他们的源代码。

保存函数看起来像是为将单个矩阵转储到单个文件而设计的。在函数 save_hdf5_binary()(一个版本为 diskio_meat.hpp:1255)中,他们使用 H5F_ACC_TRUNC 标志调用 H5Fcreate(),这将破坏任何现有文件。没有 'open if file exists' 或 clobber/non-clobber 选项。唯一的 H5Fopen() 调用是在 hdf5_binary_load() 函数中,这些调用不会保持文件打开以供以后写入。

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

此外,就其价值而言,'appending to an HDF5 file' 并不是真正正确的思考方式。 HDF5 文件不像文本文件那样是 byte/character 流。附加到数据集,是的。文件,没有。将其视为关系数据库:您可以将数据附加到 table,但您可能不会说您正在将数据附加到数据库。

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