c++ - 如何使用C++ API在HDF5文件中写入/读取锯齿状阵列?

标签 c++ hdf5

我有多个不同大小的std::vector,包含浮点数。我想将它们全部写成一个锯齿状的数组放在HDF5文件中(理想情况下是使用hyperslabs一个接一个地写,因为我不能同时将所有 vector 保存在内存中)。我相信我应该使用一个规则数组,其每个元素都是可变长度数据类型,但是我发现的所有示例都是C示例。我的代码如下所示:

#include <vector>
#include "H5Cpp.h"

int main() {
  std::vector<float> v1 {0.1, 0.2, 0.3};
  std::vector<float> v2 {0.4, 0.5};

  H5::VarLenType array_type (H5::PredType::NATIVE_FLOAT);

  hsize_t dimensions[1] = {2};
  H5::DataSpace dataspace (1, dimensions);

  H5::H5File file ("jarray.h5", H5F_ACC_TRUNC);
  H5::DataSet dataset = file.createDataSet("jarray", array_type, dataspace);

  hsize_t size[1] = {1};
  hsize_t offset[1] = {0};
  dataspace.selectHyperslab(H5S_SELECT_SET, size, offset);

  dataset.write(v1.data(), array_type);

  return 0;
};

如果我忽略了对write函数的调用,则代码将创建具有以下结构的空文件(由h5dump打印):
HDF5 "jarray.h5" {
GROUP "/" {
   DATASET "jarray" {
      DATATYPE  H5T_VLEN { H5T_IEEE_F32LE}
      DATASPACE  SIMPLE { ( 2 ) / ( 2 ) }
      DATA {
      (0): (), ()
      }
   }
}
}

这使我相信该数据集具有正确的结构,但是我没有正确地编写部分。

有人可以澄清如何写入这样的数组吗?之后如何回读值呢?任何帮助将非常感激。

最佳答案

不确定如何使用HDF5 C++ API来执行此操作,但是您可以尝试HDFql,因为它可以帮助您摆脱HDF5低级详细信息。在C++中使用HDFql,您可以执行以下操作来写入/读取HDF5锯齿状数组:

// create HDF5 file 'jarray.h5'
HDFql::execute("CREATE FILE jarray.h5");

// use (i.e. open) file 'jarray.h5'
HDFql::execute("USE FILE jarray.h5");

// create HDF5 dataset 'jarray' of one dimension (size 2) as a variable-length float (i.e. jagged)
HDFql::execute("CREATE DATASET jarray AS VARFLOAT(2)");

// write 0.1, 0.2 and 0.3 in first row of dataset 'jarray', 0.4 and 0.5 in second row
HDFql::execute("INSERT INTO jarray VALUES((0.1, 0.2, 0.3), (0.4, 0.5))");

// read first row of dataset 'jarray' using an hyperslab and populate cursor with values
HDFql::execute("SELECT FROM jarray(0:::1)");

// display values of first row
while (HDFql::cursorNext() == HDFql::SUCCESS)
{
     std::cout << *HDFql::cursorGetFloat() << std::endl;
}

// read second row of dataset 'jarray' using an hyperslab and populate cursor with values
HDFql::execute("SELECT FROM jarray(1:::1)");

// display values of second row
while (HDFql::cursorNext() == HDFql::SUCCESS)
{
     std::cout << *HDFql::cursorGetFloat() << std::endl;
}

这是一个基于直接写入值的简短示例。如果您需要使用用户定义的存储器(即变量)进行写入/读取,请查看reference manualexamples以获取更多信息。

关于c++ - 如何使用C++ API在HDF5文件中写入/读取锯齿状阵列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60509028/

相关文章:

c++ - 以 enable_if 作为模板参数的模板类方法定义

c++ - 结构内的卡尔曼滤波器无法对其进行初始化

c++ - 在 C++ 代码中使用字符 `$` 或 `@` 有什么问题吗?

c++ hash_multimap 如何获取值

python - HDF5 用于 python 和 R 之间的数据交换

fortran - 在 fortran 中追加写入 hdf5 文件

c++ - 无法在 Struct 中输出 char

python - 在 Python 中将分层 pandas DatetimeIndex 保存到 hdf5 时丢失时区感知

c++ - 使用静态链接编译 hdf5 项目

python - 如何读取大型文本文件避免逐行读取::Python