Мне нужно каким-то образом сохранить массив 512 ^ 3 на диске, и сейчас я использую HDF5. Поскольку массив разреженный, много дискового пространства тратится впустую.
Обеспечивает ли HDF5 поддержку разреженного массива?
Мне нужно каким-то образом сохранить массив 512 ^ 3 на диске, и сейчас я использую HDF5. Поскольку массив разреженный, много дискового пространства тратится впустую.
Обеспечивает ли HDF5 поддержку разреженного массива?
Блокированные наборы данных (H5D_CHUNKED) допускают разреженное хранение, но в зависимости от ваших данных накладные расходы могут быть значительными.
Возьмите типичный массив и попробуйте как разреженный, так и неразреженный, а затем сравните размеры файлов, тогда вы увидите, действительно ли это стоит.
Одним из обходных путей является создание набора данных с опцией 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
).
Аналогичного можно добиться с помощью C++ HDF5 API, установив H5::DSetCreatPropList ::setDeflate на 9, с примером, показанным в < strong>h5group.cpp.
compression_opts
в приведенном выше коде?
- person Rama; 13.04.2017
HDF5 обеспечивает индексированное хранилище: http://www.hdfgroup.org/HDF5/doc/TechNotes/RawDStorage.html