У меня есть несколько std::vector
разных размеров, содержащих поплавки. Я хотел бы записать / прочитать их все в виде зубчатого массива в файле HDF5 (в идеале один за другим, используя гиперсписки, так как я не могу держать все векторы в памяти одновременно). Я считаю, что мне следует использовать обычный массив, каждый из элементов которого имеет тип данных переменной длины, но все примеры, которые я нашел, были 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): (), ()
}
}
}
}
Это заставляет меня верить, что набор данных имеет правильную структуру, но я не совсем правильно пишу.
Может кто-нибудь уточнить, как записать в такой массив? Как один go о чтении значений потом? Любая помощь будет высоко ценится.