Я использую 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++ нет такого примера.
Кто-нибудь знает, как реализовать либо плотное хранилище, либо хранение атрибутов в виде ссылок на наборы данных на С++?