Большие атрибуты в HDF5 (C++)

Я использую API HDF5 C++. У меня есть программа, которая очень редко должна записывать атрибуты размером более 64 КБ. Он генерирует исключение H5::AttributeIException при попытке записи такого большого атрибута.

В документации HDF5 упоминаются два способа хранения больших атрибутов. Первый вариант — это плотное хранилище (доступно, по-моему, с версии 1.8.8), а второй вариант — разгрузка данных в атрибуте в дополнительный набор данных и сохранение ссылки на этот набор данных внутри атрибута. Этот второй вариант должен быть обратно совместим, в то время как первый вариант нарушает совместимость с версиями HDF5 до 1.8.8.

К сожалению, похоже, нет никакой документации о том, как реализовать любой из этих вариантов на C++. Я попытался взломать первый вариант, объединив C API с C++ API. Вот моя попытка, основанная на примере плотного хранилища здесь:

hid_t dID = dataset->getId();
herr_t res = H5Pset_attr_phase_change(dID, 0, 0);
if(res < 0) {
    std::cerr << "Failed to specify dense storage." << std::endl;
}

Здесь набор данных — это объект H5::DataSet. Этот код не может установить плотное хранилище, на что указывает res всегда отрицательное значение. Я думаю, это может быть связано с тем, что я не указываю что-то вроде H5F_LIBVER_LATEST, как это сделано в примере C с плотным хранилищем:

fpid = H5Pcreate (H5P_FILE_ACCESS);
status = H5Pset_libver_bounds (fpid, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
fid = H5Fcreate("adense.h5", H5F_ACC_TRUNC, H5P_DEFAULT, fpid);

Я не могу найти в C++ API способ указать H5F_LIBVER_LATEST. Насколько я могу судить по 1FileAccPropList. html" rel="nofollow">документация.

Что касается второго варианта, то есть сохранения атрибута как ссылки на вспомогательный набор данных, я не знаю, с чего начать, поскольку в документации по C++ нет такого примера.

Кто-нибудь знает, как реализовать либо плотное хранилище, либо хранение атрибутов в виде ссылок на наборы данных на С++?


person apdnu    schedule 16.05.2013    source источник


Ответы (3)


Для будущих ссылок:

Существует способ установить версию библиотеки (с API С++):

void H5::FileAccPropList::setLibverBounds   (H5F_libver_t   libver_low,
                                             H5F_libver_t   libver_high 
                                            ) const

ССЫЛКА:

person pablo_worker    schedule 09.04.2018

H5::FileAccPropList имеет перегруженный конструктор, который позволяет объекту наследовать (или, скорее, обертывать) существующий список свойств доступа к файлам, созданный с помощью C API. Итак, вы должны быть в состоянии сделать что-то вроде:

hid_t fapl = H5Pcreate(H5P_FILE_ACCESS);
H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
H5::FileAccPropList faplObj(fapl);
...
person Hristo Iliev    schedule 27.05.2013

(недостаточно представителей для комментирования вопроса).

Функция плотного хранения атрибутов была введена в выпуске HDF5 1.8.0 в соответствии с https://support.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetAttrPhaseChange.

person t-b    schedule 01.02.2017