测试 HDF5/c++ 中存在的数据集并处理错误

Posted

技术标签:

【中文标题】测试 HDF5/c++ 中存在的数据集并处理错误【英文标题】:test dataset existence in HDF5/c++ and handle the error 【发布时间】:2021-09-10 17:27:11 【问题描述】:

我正在使用 C++ 中的 HDF5 库读取 *.hdf5 系列文件。这些文件具有相同的数据集(相同的keys,但信息不同),但有时单个数据集可能会在文件中丢失(例如,在 100 个文件中我有数据集apple,在 3 个文件中我没有任何@ 987654323@ dataset),在这些情况下有以下例外:

HDF5-DIAG: Error detected in HDF5 (1.10.7) thread 0:
 #000: H5D.c line 298 in H5Dopen2(): unable to open dataset
   major: Dataset
   minor: Can't open object
 [...]
 #005: H5Gloc.c line 376 in H5G__loc_find_cb(): object 'apple' doesn't exist
   major: Symbol table
   minor: Object not found
terminate called after throwing an instance of 'H5::GroupIException'

当发生此错误时,我想处理此异常,例如为该文件创建一个空的苹果数据集。

在这里,我发布了读取文件->组->数据集的代码块。处理错误,我想创建一个空的GoldenApples 向量,即使数据集apple 不存在。

 std::string FileName = "fruit." + std::to_string(cutID) + ".hdf5";

 fruitFile = H5::H5File(FileName, H5F_ACC_RDONLY );

 H5::Group group = fruitFile.openGroup("fruit");
 H5::DataSet dataset = group.openDataSet("apple");
 H5::DataSpace dataspace = dataset.getSpace();
 hsize_t naxes[2];
 dataspace.getSimpleExtentDims(naxes, NULL);

 AppleType = Eigen::MatrixXd::Zero(naxes[1], naxes[0]);

 dataset.read(AppleType.data(), H5::PredType::NATIVE_DOUBLE);

 GoldenApples = std::vector<int>(naxes[0], 0.);
 

 //need golden apples, which are in pos (4,i) in matrix AppleType
 for (int i = 0; i < naxes[0]; i++)
   GoldenApples[i] = AppleType(4,i);
   
 

 fruitFile.close();

【问题讨论】:

【参考方案1】:

如果您未绑定到特定库,请查看HDFql,因为使用它很容易检查 HDF5 数据集的存在。在 C++ 中使用 HDFql,您的用例可以解决如下:

// check if dataset 'apple' exists in HDF5 file 'fruit.h5'
if (HDFql::execute("SHOW DATASET fruit.h5 apple") == HDFql::Success)

    std::cout << "Dataset apple exists!" << std::endl;

else

    std::cout << "Dataset apple does not exist!" << std::endl;

有关 HDFql 的更多信息,请查看其reference manual 以及一些examples。

【讨论】:

以上是关于测试 HDF5/c++ 中存在的数据集并处理错误的主要内容,如果未能解决你的问题,请参考以下文章

SSAS 多维数据集处理

处理非常大的数据集并及时加载

HDF5作为Windows下的动态链接库Qt/C++

SSIS 执行 Analysis Services 任务错误:指定的登录会话不存在。它可能已经被终止

R语言使用caret包中的createDataPartition函数进行机器学习数据集划分划分训练集和测试集并指定训练测试比例

R语言使用caret包中的createDataPartition函数进行机器学习数据集划分划分训练集和测试集并指定训练测试比例