Удаление данных из файла HDF5 - PullRequest
16 голосов
/ 14 июля 2009

У меня есть файл HDF5 с одномерным (N x 1) набором данных составных элементов - на самом деле это временной ряд. Данные сначала собираются в автономном режиме в файл HFD5, а затем анализируются. В ходе анализа большая часть данных оказывается неинтересной, и только некоторые ее части являются интересными. Поскольку наборы данных могут быть довольно большими, я бы хотел избавиться от неинтересных элементов, сохранив при этом интересные. Например, сохраните элементы 0-100 и 200-300 и 350-400 набора данных из 500 элементов, сбросьте остальные. Но как?

Есть ли у кого-нибудь опыт, как этого добиться с HDF5? По-видимому, это можно сделать несколькими способами, по крайней мере:

  • (Очевидное решение), создайте новый свежий файл и запишите необходимые данные там, элемент за элементом. Затем удалите старый файл.
  • Или, в старом файле, создайте новый свежий набор данных, запишите в него необходимые данные, отсоедините старый набор данных с помощью H5Gunlink () и избавьтесь от свободного места, выполнив файл через h5repack.
  • Или переместите интересные элементы в существующем наборе данных к началу (например, переместите элементы 200-300 в позиции 101-201 и элементы 350-400 в позиции 202-252). Затем вызовите H5Dset_extent (), чтобы уменьшить размер набора данных. Затем, возможно, запустите h5repack, чтобы освободить свободное место.

Поскольку файлы могут быть довольно большими даже после удаления неинтересных элементов, я бы не стал переписывать их (это заняло бы много времени), но, похоже, требуется фактически освободить свободное пространство. Любые советы от экспертов HDF5?

Ответы [ 2 ]

9 голосов
/ 14 июля 2009

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

Что-то, что вы можете сделать, это иметь боковой набор данных, содержащий логическое значение, сообщающее вам, какие значения являются «живыми», а какие были удалены. Это не уменьшает размер файла, но, по крайней мере, дает вам быстрый способ удаления.

Альтернативой является определение плиты в вашем массиве, копирование соответствующих данных, затем удаление старого массива или всегда доступ к данным через плиту, а затем переопределение их по мере необходимости (хотя я никогда этого не делал , так что я не уверен, возможно ли это, но так и должно быть)

Наконец, вы можете использовать стратегию монтирования hdf5, чтобы ваши наборы данных содержались в «прикрепленном» hdf5-файле, который вы монтируете в корневой hdf5. Если вы хотите удалить материал, скопируйте интересные данные в другой смонтированный файл, размонтируйте старый файл и удалите его, а затем перемонтируйте новый файл в нужное место. Это решение может быть грязным (поскольку у вас есть несколько файлов), но оно позволяет вам освободить место и работать только с частями вашего дерева данных, а не с помощью перепаковки.

2 голосов
/ 27 сентября 2017

Копирование данных или использование h5repack, как вы описали, - это два обычных способа «сжатия» данных в файле HDF5, к сожалению.

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

Как уже упоминалось в другом ответе, вы можете использовать внешние ссылки или функцию виртуального набора данных для создания файлов HDF5, которые были бы более восприимчивы к таким манипуляциям, которые вы будете выполнять, но я подозреваю, что вы все равно будете копирование большого количества данных, и это, безусловно, добавит дополнительную сложность и накладные расходы на управление файлами.

Кстати, H5Gunlink () устарела. H5Ldelete () является предпочтительной заменой.

...