файлы hdf5 становятся огромными, пока только добавляются

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

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

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

Вот пример с небольшим файлом. Файл, сгенерированный моим приложением (с использованием zlib и complevel 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 я получаю файл размером 19 КБ.

/ (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}

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

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

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

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

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

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

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


person Jérôme    schedule 04.06.2018    source источник