Я хотел бы программно изменить данные, связанные с набором данных в файле HDF5. Кажется, я не могу найти способ удалить набор данных по имени (что позволяет мне снова добавить его с измененными данными) или обновить набор данных по имени. Я использую C API для HDF5 1.6.x, но были бы полезны указатели на любой HDF5 API.





Согласно руководству пользователя:
HDF5 does not at this time provide an easy mechanism to remove a dataset from a file or to reclaim the storage space occupied by a deleted object.
О таком простом удалении не может быть и речи. Но раздел продолжается:
Removing a dataset and reclaiming the space it used can be done with the
H5Ldeletefunction and theh5repackutility program. With theH5Ldeletefunction, links to a dataset can be removed from the file structure. After all the links have been removed, the dataset becomes inaccessible to any application and is effectively removed from the file. The way to recover the space occupied by an unlinked dataset is to write all of the objects of the file into a new file. Any unlinked object is inaccessible to the application and will not be included in the new file. Writing objects to a new file can be done with a custom program or with theh5repackutility program.
Документация по «изменению» таблицы в PyTables находится в pytables.org/moin/HintsForSQLUsers#Alteringatable, но обратите внимание: «(добавление столбца) в настоящее время не поддерживается в PyTables».
Странно получать анонимный отрицательный голос через пять лет после ответа на вопрос, тем более что мой ответ ссылается на соответствующую документацию, в которой четко указано, что это было невозможно в 2009 году. Была ли добавлена эта возможность?
@MaxLybbert, пожалуйста, подскажите еще один способ удалить все значения из набора данных и изменить размер набора данных в соответствии с новыми значениями.
@MohiniMhetre: Я искал в HDF5 кое-что, над чем я баловался пять лет назад, но я никогда не относился серьезно к этому проекту. Я, конечно, не эксперт по HDF5. Насколько я помню, есть возможность удалять / обновлять данные; но файл не уменьшится в размере, даже если вы удалите значения. Кажется, что более распространено просто воссоздать файл с нуля, используя обновленные данные.
H5Ldelete. Я не знаю, намеренно это или случайно.
Если вы хотите удалить набор данных в C++, вам понадобятся следующие команды:
H5File m_h5File (pathAndNameToHDF5File, H5F_ACC_RDWR); //The hdf5 c++ object.
std::string channelName = "/myGroup/myDataset";
int result = H5Ldelete(m_h5File.getId(), channelName.data(), H5P_DEFAULT);
В случае успеха результат будет неотрицательным значением; в противном случае возвращает отрицательное значение. https://support.hdfgroup.org/HDF5/doc/RM/RM_H5L.html#Link-Delete
Как сказал @MaxLybbert, пространство на жестком диске не восстанавливается. Вы должны использовать инструмент переупаковки. Однако с HDF5 v.1.10 это пространство можно восстановить. Но руководство пользователя еще не готово: https://support.hdfgroup.org/HDF5/docNewFeatures/NewFeaturesFileSpaceMgmtDocs.html
Спасибо. Есть идеи, как PyTables (движок Python, созданный поверх HDF5) справляется с этим?