HDF5 - запись / добавление составного типа данных HDF5 по одному с помощью Hyperslab?

Я пытаюсь записать свой составной тип данных один за другим в мой файл с помощью C++ API. Я использую HDF5-1.8.18 на Win64.

Я хочу написать мои составные объекты типа данных один за другим. У меня есть несколько составных типов, и они не входят в "сложенный" буфер, они просто "приходят" один за другим. Мой код не выполняется, когда я пытаюсь записать в выбранную Hyperslab.

Я хочу, чтобы моя Hyperslab выбирала ровно один элемент составного типа данных из набора данных одновременно. В этом тестовом коде я всегда хочу писать в индекс 3. Очевидно, что позже я переключусь со статического индекса на переменную счетчика.

Мое пространство данных является одномерным:

  • Ранг = 1
  • dim = количество объектов данных (например: 213)

Код, который я использую для записи своих данных:

H5::CompType compType = group->openCompType("tTestData");

H5::DataSpace fspace1 = dataset->getSpace();
hsize_t start[]  = {3};
hsize_t stride[] = {1};
hsize_t count[]  = {1};
hsize_t block[]  = {1};

fspace1.selectHyperslab( H5S_SELECT_SET, count, start, stride, block );
dataset->write(&myTestData, compType, fspace1);

Исключение, которое выдается:

HDF5-DIAG: Error detected in HDF5 (1.8.18) thread 0:
  #000: ..\..\hdf5-1.8.18\src\H5Dio.c line 271 in H5Dwrite(): can't prepare for
writing data
    major: Dataset
    minor: Write failed
  #001: ..\..\hdf5-1.8.18\src\H5Dio.c line 352 in H5D__pre_write(): can't write
data
    major: Dataset
    minor: Write failed
  #002: ..\..\hdf5-1.8.18\src\H5Dio.c line 697 in H5D__write(): src and dest dat
a spaces have different sizes
    major: Invalid arguments to routine
    minor: Bad value

Как мне настроить Hyperslab, чтобы можно было писать по одному объекту составного типа данных одновременно? Кажется, мне нужно настроить переменные, которые я передаю selectHyperslab но я не уверен, какие параметры передать?

1 ответ

Решение

Тем временем я нашел решение этой проблемы:

//h5 is a custom Adapter class, which allows me to reuse groups, datasets etc. 
//h5 also keeps track of the count of written data objects in a dataset (used below)  
//These functions are not included in HDF5. Just encapsulate the complexity of the HDF5 lib
H5::Group* group = h5->GetGroupPtr();
H5::CompType compType = group->openCompType("someCompType");    
H5::DataSet* dataset = h5->GetDataSet("someDataSet");


//get dataspace of our dataset
H5::DataSpace fspace1 = dataset->getSpace();

//define a 1x1 (one data row) dataspace
hsize_t dim[] = {1};
H5::DataSpace space( 1, dim );

//get current data offset (index) and set stride, count, block to 1
tInt64 currentCounter = h5->GetDataSetCounter("someDataSet");
hsize_t start[]  = {currentCounter};
hsize_t stride[] = {1};
hsize_t count[]  = {1};
hsize_t block[]  = {1};

//select the 1x1 hyperslab 
fspace1.selectHyperslab( H5S_SELECT_SET, count, start, stride, block );
dataset->write(&data, compType, space, fspace1);

//clean up used resources
fspace1.close();
space.close();

См. Документацию Hyperslab для получения дополнительной информации.

Другие вопросы по тегам