Я использую HDF5 C ++ API. У меня есть программа, которая очень редко должна писать атрибуты размером более 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. Класс H5 :: FileAccPropList не имеет никакой функции-члена, схожей с set_libver_bounds, насколько я могу судить по документация.
Что касается второго варианта, то есть сохранения атрибута как ссылки на вспомогательный набор данных, я не знаю, с чего начать, так как в документации по C ++ такого нет.
Кто-нибудь знает, как реализовать плотное хранение или хранение атрибутов в качестве ссылок на наборы данных в C ++?
Для будущих ссылок:
Существует метод для установки версии lib (с C ++ API):
void H5::FileAccPropList::setLibverBounds (H5F_libver_t libver_low,
H5F_libver_t libver_high
) const
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);
...
(недостаточно реп для комментирования вопроса).
Функция плотного хранения атрибутов была представлена в выпуске HDF5 1.8.0 в соответствии с https://support.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetAttrPhaseChange.