Я использую API HDF5 C++. У меня есть программа, которая изредка должна писать атрибуты размером больше 64 КБ. Он бросает исключение H5 :: AttributeIException при попытке написать такой большой атрибут.Большие атрибуты в HDF5 (C++)
В документации HDF5 упоминаются два способа хранения больших атрибутов. Первый вариант - это плотное хранилище (доступно с версии 1.8.8, я думаю), в то время как второй вариант - это разгрузка данных в атрибуте на дополнительный набор данных и сохранение ссылки на этот набор данных внутри атрибута. Этот второй вариант должен быть обратно совместим, в то время как первый вариант нарушает совместимость с версиями HDF5 до 1.8.8.
К сожалению, похоже, что нет какой-либо документации о том, как реализовать любой из этих параметров в C++. Я попытался взломать первый вариант, объединив C API с C++ API. Вот моя попытка, основанная на плотном примере here хранения:
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, насколько я могу судить по documentation.
Что касается второго варианта сохранения атрибута как ссылки на вспомогательный набор данных, я не знаю, с чего начать, поскольку в документации на C++ нет примера.
Кто-нибудь знает, как реализовать либо плотное хранилище, либо хранить атрибуты в качестве ссылок на наборы данных в C++?