2013-05-16 2 views
2

Я использую 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++?

ответ

0

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

hid_t fapl = H5Pcreate(H5P_FILE_ACCESS); 
H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST); 
H5::FileAccPropList faplObj(fapl); 
... 
Смежные вопросы