Поддержка разреженных массивов в HDF5

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

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


person andreabedini    schedule 23.08.2010    source источник
comment
[Этот ответ] [1] предоставляет решение (только для Python). [1]: stackoverflow.com/a/22589030/2858145   -  person Pietro Battiston    schedule 23.03.2014


Ответы (3)


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

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

person Simon    schedule 18.02.2011
comment
да, в этом сообщении объясняется, как это сделать это (или, возможно, как не это делать) спасибо - person andreabedini; 02.03.2011

Одним из обходных путей является создание набора данных с опцией 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.

person Mike T    schedule 05.09.2014
comment
Хотя анализ действительно выполняется на python, файл hdf5 создается на C++, поэтому h5py не подходит. Поддерживается ли такое же сжатие изначально hdf5? Я знаю, что pytables и h5py поддерживают дополнительные протоколы сжатия. - person andreabedini; 28.09.2014
comment
@andreabedini Я обновил ответ ссылкой на пример C ++, который использует ту же технику. Я считаю, что набор данных должен быть разбит на части, чтобы включить сжатие. - person Mike T; 29.09.2014
comment
Из ссылки HDF5 в начале ответа : Хранилище с фрагментами позволяет изменять размер наборов данных, а поскольку данные хранятся фрагментами фиксированного размера, использовать фильтры сжатия. Итак, да, фрагментация требуется для сжатия. - person hBy2Py; 06.07.2015
comment
Что делает compression_opts в приведенном выше коде? - person Rama; 13.04.2017
comment
@Rama 9 — максимальный уровень сжатия; см. документацию - person Mike T; 14.04.2017

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

person Alexandre C.    schedule 17.02.2011
comment
привет, я не совсем знаком с тем, как hdf5 работает внутри, как я могу хранить необработанные данные в файле hdf5? означает ли это, что я могу обойти тип данных Table и написать свои собственные структуры? - person andreabedini; 02.03.2011