Поддержка разреженных массивов в HDF5
Мне нужно некоторое время хранить массив 512 ^ 3 на диске, и в настоящее время я использую HDF5. Поскольку массив разрежен, большое количество дискового пространства теряется.
Поддерживает ли HDF5 любую поддержку для разреженного массива?
Ответы
Ответ 1
Блокированные наборы данных (H5D_CHUNKED) допускают разреженное хранилище, но в зависимости от ваших данных могут быть важны служебные данные.
Возьмите типичный массив и попробуйте как разреженные, так и не разреженные, а затем сравните размеры файлов, а затем вы увидите, действительно ли это стоит.
Ответ 2
Обходным путем является создание набора данных с опцией compression
. Например, в Python с использованием h5py:
import h5py
f = h5py.File('my.h5', 'w')
d = f.create_dataset('a', dtype='f', shape=(512, 512, 512), fillvalue=-999.,
compression='gzip', compression_opts=9)
d[3, 4, 5] = 6
f.close()
Итоговый файл - 4,5 КБ. Без сжатия этот же файл будет содержать около 512 МБ. Это сжатие 99,999%, потому что большинство данных -999.
(или любой другой fillvalue
, который вы хотите).
Эквивалент может быть достигнут с использованием API С++ HDF5, установив H5:: DSetCreatPropList:: setDeflate на 9, с показан в h5group.cpp.
Ответ 3
HDF5 предоставляет индексированное хранилище: http://www.hdfgroup.org/HDF5/doc/TechNotes/RawDStorage.html