PyTables и HDF5: большие накладные расходы для данных дерева

У меня есть древовидная структура данных, которую я хочу сохранить на диск. Таким образом, HDF5 с его внутренней структурой дерева казался идеальным кандидатом. Тем не менее, пока данные огромны, в 100 раз!

Тестовое дерево содержит примерно 100 узлов, где листья обычно содержат не более 2 или 3 элементов данных (например, двойных). Если я возьму все дерево и просто засолу его, оно будет размером около 21 КБ. Тем не менее, если я использую PyTables и отображаю древовидную структуру один в один в файл HDF5, файл занимает 2,4 МБ (!) Дискового пространства. Слишком большие накладные расходы?

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

Я что-то упустил в отношении PyTables, например, включение сжатия (я думал, что PyTables делает это по умолчанию)? В чем может быть причина этих огромных накладных расходов?

Большое спасибо!

1 ответ

Решение

Итак, я нашел способ значительно уменьшить размер файла. Дело в том, что, несмотря на мои предыдущие убеждения, PyTables НЕ применяет сжатие по умолчанию.

Вы можете достичь этого с помощью Filters,

Вот пример того, как это работает:

   import pytables as pt

   hdf5_file = pt.openFile(filename = 'myhdf5file.h5', 
                           mode='a', 
                           title='How to compress data') 
   # for pytables >= 3 the method is called `open_file`, 
   # other methods are renamed analogously

   myfilters = Filters(complevel=9, complib='zlib')

   mydescitpion = {'mycolumn': pt.IntCol()} # Simple 1 column table

   mytable = hdf5_file.createTable(where='/', name='mytable',
                                     description=mydescription,
                                     title='My Table',
                                     filters=myfilters)
   #Now you can happily fill the table...

Важная линия здесь Filters(complevel=9, complib='zlib'), Указывает уровень сжатия complevel и алгоритм сжатия complib, По умолчанию уровень установлен на 0, это означает, что сжатие отключено, тогда как 9 - это самый высокий уровень сжатия. Для получения подробной информации о том, как работает сжатие: ЗДЕСЬ ССЫЛКА НА ССЫЛКУ.

В следующий раз мне лучше придерживаться RTFM:-) (хотя я и сделал, но пропустил строку "Одна из прелестей PyTables заключается в том, что он поддерживает сжатие таблиц и массивов, хотя по умолчанию он не используется")

Другие вопросы по тегам