hdf5 файлы растут огромными, пока только добавляются - PullRequest
0 голосов
/ 04 июня 2018

Я использую панду HDFStore для хранения данных в файлах hfd5.

Как правило, данные добавляются по одному образцу за раз, а не длинными партиями.

Я заметил, что файлырастет довольно быстро, и я могу существенно уменьшить их с помощью ptrepack.

Вот пример с небольшим файлом.Файл, сгенерированный моим приложением (с использованием zlib и completevel 9), имеет размер 6,7 МБ.

/ (RootGroup) ''
/test (Group) ''
/test/table (Table(1042,), shuffle, zlib(1)) ''
  description := {
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "values_block_0": Float64Col(shape=(2,), dflt=0.0, pos=1),
  "values_block_1": Int64Col(shape=(1,), dflt=0, pos=2)}
  byteorder := 'little'
  chunkshape := (2048,)
  autoindex := True
  colindexes := {
    "index": Index(6, medium, shuffle, zlib(1)).is_csi=False}

Если я перезаписываю его без параметров, он становится значительно меньше (71 КБ):

/ (RootGroup) ''
/test (Group) ''
/test/table (Table(1042,)) ''
  description := {
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "values_block_0": Float64Col(shape=(2,), dflt=0.0, pos=1),
  "values_block_1": Int64Col(shape=(1,), dflt=0, pos=2)}
  byteorder := 'little'
  chunkshape := (2048,)

При использовании --complevel=1 или --complevel=9 я получаю файл 19K.

/ (RootGroup) ''
/test (Group) ''
/test/table (Table(1042,), shuffle, zlib(1)) ''
  description := {
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "values_block_0": Float64Col(shape=(2,), dflt=0.0, pos=1),
  "values_block_1": Int64Col(shape=(1,), dflt=0, pos=2)}
  byteorder := 'little'
  chunkshape := (2048,)


/ (RootGroup) ''
/test (Group) ''
/test/table (Table(1042,), shuffle, zlib(9)) ''
  description := {
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "values_block_0": Float64Col(shape=(2,), dflt=0.0, pos=1),
  "values_block_1": Int64Col(shape=(1,), dflt=0, pos=2)}
  byteorder := 'little'
  chunkshape := (2048,)

Это небольшие файлы, но я хочу уменьшить размер всей базы данных 35 ГБ до нескольких сотен МБ.перепаковав его.

Должно быть что-то не так в том, как написано.

Я знаю о "hdf5 не освобождает пробел" предупреждение .Обычный вариант использования не включает удаление данных или, возможно, незначительное.

Для добавления новых данных я использую

store.append(data_id, data_dataframe)

, поэтому я только добавляю.Я не удаляю и не записываю целые данные.

Я заметил разницу в дампах выше

  autoindex := True
  colindexes := {
    "index": Index(6, medium, shuffle, zlib(1)).is_csi=False}

, но я не знаю, что по этому поводу делать.

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

Или потому, что каждый раз, когда блок изменяется, он записывается в другое пространство, а старое пространство фрагмента теряется?

В этом случае, я думаю, мои варианты:

  • Измените приложение так, чтобы данные записывались пакетами.Может быть, добавив кеширующий слой.Практически невозможно.Я мог бы также изменить базовую базу данных.

  • Выбрать гораздо меньший размер чанка.Но это также имеет свои недостатки.

  • Установите скрипт для регулярной повторной упаковки данных.

...