2010-08-23 20 views
13

Necesito almacenar una matriz 512^3 en el disco de alguna manera y actualmente estoy usando HDF5. Como la matriz es escasa, se desperdicia mucho espacio en el disco.Soporte de matriz dispersa en HDF5

¿Proporciona HDF5 algún soporte para matriz dispersa?

+0

[Esta respuesta] [1] proporciona una solución (solo Python). [1]: http://stackoverflow.com/a/22589030/2858145 –

Respuesta

2

conjuntos de datos fragmentada (H5D_CHUNKED) permiten el almacenamiento escaso pero dependiendo de sus datos, la sobrecarga puede ser importante.

Tome una matriz típica y pruebe tanto dispersa como no dispersa y luego compare los tamaños de los archivos, luego verá si realmente vale la pena.

+1

sí, [este] (http://mail.hdfgroup.org/pipermail/hdf-forum_hdfgroup.org/2010-March/002704.html) publicación explica cómo hacerlo (o quizás cómo _no_ hacerlo) gracias – andreabedini

1

HDF5 proporciona almacenamiento indexado: http://www.hdfgroup.org/HDF5/doc/TechNotes/RawDStorage.html

+0

hola, no estoy muy familiarizado con el funcionamiento interno de hdf5, ¿cómo puedo almacenar datos sin formato en un archivo hdf5? ¿eso significa que puedo pasar por alto el tipo de datos Table y escribir mis propias estructuras? – andreabedini

12

Una solución consiste en crear el conjunto de datos con compression option. Por ejemplo, en Python usando 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() 

El archivo resultante es de 4,5 kb. Sin compresión, este mismo archivo sería de aproximadamente 512 MB. Eso es una compresión del 99.999%, porque la mayoría de los datos son -999. (o lo que sea fillvalue que desee).


El equivalente puede lograrse mediante la API de C++ HDF5 configurando H5::DSetCreatPropList::setDeflate a 9, con un example shown in h5group.cpp.

+0

Aunque el análisis se realiza en python, el archivo hdf5 se genera en C++, por lo que h5py no es una opción. ¿Es el mismo tipo de compresión soportado de forma nativa por hdf5? Sé que pytables y h5py admiten protocolos de compresión adicionales. – andreabedini

+1

@andreabedini He actualizado la respuesta con un enlace a un ejemplo de C++ que hace la misma técnica. Creo que el conjunto de datos debe fragmentarse para permitir la compresión. –

+0

Desde el [enlace de HDF5] (http://docs.h5py.org/en/latest/high/dataset.html#chunked-storage) al principio de la respuesta: "El almacenamiento fragmentado permite cambiar el tamaño de los conjuntos de datos, y porque los datos se almacenan en fragmentos de tamaño fijo, para usar filtros de compresión ". Entonces, sí, se requiere fragmentación para la compresión. – hBy2Py

Cuestiones relacionadas