Память HDF5
Я записываю большое количество небольших наборов данных в файл HDF5, и размер получаемого файла примерно в 10 раз больше, чем я ожидал бы от наивного табулирования вводимых данных. Мои данные организованы иерархически следующим образом:
group 0
-> subgroup 0
-> dataset (dimensions: 100 x 4, datatype: float)
-> dataset (dimensions: 100, datatype: float)
-> subgroup 1
-> dataset (dimensions: 100 x 4, datatype: float)
-> dataset (dimensions: 100, datatype: float)
...
group 1
...
Каждая подгруппа должна занимать 500 * 4 байта = 2000 байтов, игнорируя издержки. Я не храню никаких атрибутов рядом с данными. Тем не менее, в ходе тестирования я обнаружил, что каждая подгруппа занимает около 4 КБ, или примерно в два раза больше, чем я ожидал. Я понимаю, что есть некоторые накладные расходы, но откуда они берутся и как их уменьшить? Это в представлении структуры группы?
Дополнительная информация: Если я увеличу размеры двух наборов данных в каждой подгруппе до 1000 x 4 и 1000, то каждая подгруппа займет около 22 250 байт, а не плоские 20 000 байт, которые я ожидаю. Это подразумевает накладные расходы 2,2 кБ на подгруппу и согласуется с результатами, которые я получал при меньших размерах наборов данных. Есть ли способ уменьшить эти накладные расходы?
2 ответа
Я отвечу на свой вопрос. Затраты, связанные только с представлением структуры группы, достаточны для того, чтобы не имело смысла хранить небольшие массивы или иметь много групп, каждая из которых содержит только небольшой объем данных. Кажется, нет никакого способа уменьшить накладные расходы на группу, которые я измерил на уровне около 2,2 кБ.
Я решил эту проблему, объединив два набора данных в каждой подгруппе в набор данных (100 x 5). Затем я исключил подгруппы и объединил все наборы данных в каждой группе в трехмерный набор данных. Таким образом, если раньше у меня было N подгрупп, теперь у меня есть один набор данных в каждой группе с формой (N x 100 x 5). Таким образом, я сохраняю накладные расходы N * 2,2 кБ, которые присутствовали ранее. Более того, поскольку встроенное сжатие HDF5 более эффективно при использовании больших массивов, я теперь получаю лучшее соотношение упаковки, чем 1:1, тогда как раньше издержки занимали половину пространства файла, а сжатие было совершенно неэффективным.
Урок состоит в том, чтобы избегать сложных групповых структур в файлах HDF5 и пытаться объединить как можно больше данных в каждом наборе данных.
Недавно была проведена некоторая работа в этом направлении, которая стала доступна в версии 1.10.5 . Теперь есть функция под названиемH5Fset_dset_no_attrs_hint
который устанавливает список создания свойств файла или набора данных, чтобы не выделять слишком много места в заголовке объекта.