【问题标题】:Armadillo: Save multiple datasets in one hdf5 file犰狳:将多个数据集保存在一个 hdf5 文件中
【发布时间】:2018-03-18 04:42:03
【问题描述】:

我正在尝试使用犰狳的新功能将多个数据集保存到单个 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 文件。

【问题讨论】:

    标签: c++ hdf5 armadillo


    【解决方案1】:

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

    【讨论】:

    • 是的,谢谢,这个功能从犰狳版本 8.300.0 开始可用,从那以后我一直在使用它。但是,当我第一次有需要并提出问题时,它甚至还没有出现在 armadillo-git 中。
    【解决方案2】:

    很遗憾,我认为你做不到。我是 HDF5 开发人员,而不是犰狳开发人员,但我为您了解了他们的源代码。

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

    顺便说一句,这就是你的情况正在发生的事情。 A.save() 创建一个包含 dataset1 的文件,然后 B.save() 用包含 dataset2 的新文件破坏该文件。

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

    【讨论】:

    • 感谢您花时间研究犰狳代码,我不太了解(不是程序员,只做数字)。现在我对与 hdf5 一起使用的术语有点困惑。您说将 hdf5 视为数据库,因此不会附加到文件中。我可以将添加第二个矩阵视为在数据库中创建一个新表,与现有表一起吗? hdf5 格式是否允许这样的操作,还是我需要在创建时指定所有数据集,然后修改数据集以包含实际矩阵?
    • 理论上可以。在 HDF5 中,存储数据的容器称为数据集(而不是表),它们可以随时添加到 HDF5 文件中。
    猜你喜欢
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 2012-03-26
    • 2021-07-05
    • 1970-01-01
    相关资源
    最近更新 更多