Поддержка разреженных массивов в HDF5 - PullRequest
14 голосов
/ 23 августа 2010

Мне нужно каким-то образом хранить массив 512 ^ 3 на диске, и в настоящее время я использую HDF5.Поскольку массив является разреженным, много дискового пространства теряется.

Обеспечивает ли HDF5 поддержку разреженного массива?

Ответы [ 3 ]

15 голосов
/ 05 сентября 2014

Одним из обходных путей является создание набора данных с параметром 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 C ++ HDF5 путем установки H5 :: DSetCreatPropList :: setDeflate в 9, с примером , показанным в h5group.cpp .

2 голосов
/ 18 февраля 2011

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

Возьмите типичный массив и попробуйте как разреженные, так и не разреженные, а затем сравните размеры файлов, затем выпосмотрим, действительно ли это стоит.

1 голос
/ 18 февраля 2011

HDF5 обеспечивает индексированное хранилище: http://www.hdfgroup.org/HDF5/doc/TechNotes/RawDStorage.html

...