Удаление информации из файла HDF5

Я понимаю, что пользователь SO ранее спрашивал об этом вопрос но его спросили в 2009 году, и я надеялся, что больше знаний о HDF5 было доступно или более новые версии исправили эту конкретную проблему. Чтобы повторить здесь вопрос о моей собственной проблеме;

У меня есть гигантский файл узлов и элементов из большой геометрии и уже получил всю полезную информацию, в которой я нуждаюсь. Поэтому в Python я пытаюсь сохранить исходный файл, но удалите информацию, которая мне не нужна, и заполните дополнительную информацию для других источников. Например, у меня есть набор данных узлов, который мне не нужен. Однако мне нужно сохранить соседний набор данных и включить информацию об их индексах из внешнего файла. Есть ли способ удалить эти конкретные наборы данных?

или старая идея иметь "placekeepers" в файле HDF5 все еще остается верной, так что никто не знает, как/беспокоится об удалении информации? Я не слишком беспокоюсь о пустом пространство, пока быстрее просто удалить и добавить информацию, а затем создать совершенно новый файл.

Примечание: я использую "r+" H5py для чтения и записи.

3 ответов


удаление целых узлов (групп или наборов данных) из файла hdf5 не должно быть проблемой.
Однако, если вы хотите вернуть пространство, вам нужно запустить .

С hdf5 документы:

5.5.2. Удаление набора данных из файла и восстановление пространства

HDF5 в настоящее время не обеспечивает простой механизм для удаления набор данных из файла или для освобождения дискового пространства, занимаемого удаленный объект.

удаление набора данных и восстановление используемого пространства можно сделать с помощью функция H5Ldelete и утилита h5repack. С Функция H5Ldelete, ссылки на набор данных могут быть удалены из файла структура. После удаления всех ссылок набор данных становится недоступными для любого приложения, и эффективно удаляется из файл. Способ восстановления пространства, занятого несвязанным набором данных: писать все объекты файла в новый файл. Любые несвязанные объект недоступен для приложения и не будет включен в новый файл. Запись объектов в новый файл может быть выполнена с помощью пользовательского программа или утилита h5repack.

В качестве альтернативы вы также можете посмотреть в PyTables в ptrepack. PyTables должны иметь возможность читать файлы h5py hdf5 и ptrepack инструмент похож на h5repack.

Если вы хотите удалить записи из набора данных, а затем вероятно, вам придется извлечь записи, которые вы хотите сохранить, создать новый набор данных и удалить старый.
PyTables поддерживает удаление строк, однако это не рекомендуется.


Если вы знаете, что конкретный набор данных будет удален в конце процесса анализа, зачем вообще хранить его в главном файле? Я бы сохранил временные данные в отдельном файле HDF5, который можно было бы отбросить после завершения анализа. Если важно связать временный набор данных внутри главного файла, просто создайте внешнюю связь между главным и временным с помощью H5Lcreate_external (). Внешние ссылки занимают тривиальное пространство.


в HDF5 1.10 и выше, есть механизм управление файловым пространством. Его можно реализовать, указав fcpl (список свойств создания файла) в H5F.создать.

одно важное изменение, которое вы заметите, - это то, что файл после первого импорта будет немного больше (в КБ) при первом импорте. Но после этого размер вашего файла в конечном итоге будет меньше (после процесса восстановления).

вы можете контролировать свободное пространство в HDF5 файлы с помощью h5stat инструмент

h5stat -S filename