Я использую панду 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}
, но я не знаю, что по этому поводу делать.
Я подозреваю, что проблема с размером может быть связана с тем, что образцы добавляются по одному.Но я не понимаю, почему это должно быть проблемой.Весь блок должен быть сжат при добавлении даже небольшого объема данных.
Или потому, что каждый раз, когда блок изменяется, он записывается в другое пространство, а старое пространство фрагмента теряется?
В этом случае, я думаю, мои варианты:
Измените приложение так, чтобы данные записывались пакетами.Может быть, добавив кеширующий слой.Практически невозможно.Я мог бы также изменить базовую базу данных.
Выбрать гораздо меньший размер чанка.Но это также имеет свои недостатки.
Установите скрипт для регулярной повторной упаковки данных.