HDF5: Formato de Datos Jerárquico para Computación Científica
¿Qué es HDF5?
HDF5 (Hierarchical Data Format version 5, Formato de Datos Jerárquico versión 5) es un formato de archivo y biblioteca versátil y autodescriptivo diseñado para almacenar y gestionar grandes colecciones complejas de datos científicos. Desarrollado por el National Center for Supercomputing Applications (NCSA) en los años 90 y mantenido actualmente por The HDF Group, HDF5 es el estándar de facto para datos científicos en campos que van desde la física computacional y la genómica hasta el aprendizaje automático y la teledetección satelital.
Los archivos usan la extensión .h5 o .hdf5. A diferencia de los simples CSV o formatos blob binarios, los archivos HDF5 son autodescriptivos: el formato lleva sus propios metadatos — tamaños de dimensión, tipos de datos, unidades, sistemas de coordenadas, atributos personalizados — junto con los datos brutos.
El Modelo de Datos HDF5
HDF5 organiza los datos en una jerarquía similar al sistema de archivos POSIX:
archivo.h5
├── / ← Grupo raíz
│ ├── simulacion/ ← Grupo (como un directorio)
│ │ ├── velocidad ← Conjunto de datos (array float32, forma 1000×100×100)
│ │ ├── presion ← Conjunto de datos (array float64)
│ │ └── temperatura ← Conjunto de datos
│ ├── metadatos/
│ │ └── autores ← Conjunto de datos (array de cadenas)
│ └── malla/
│ ├── coordenadas_x ← Conjunto de datos (float64, forma 101)
│ └── conectividad ← Conjunto de datos (int32, forma N×4)
Grupos
Los grupos son contenedores (análogos a directorios). Contienen otros grupos y conjuntos de datos, y pueden llevar atributos — pequeñas piezas de metadatos almacenadas directamente en el grupo.
Conjuntos de Datos (Datasets)
Los conjuntos de datos son los contenedores de datos principales — arrays N-dimensionales de un único tipo de dato. Propiedades:
- Forma: cualquier número de dimensiones y tamaños
- Tipo de dato: enteros (int8 a int64, uint8 a uint64), flotantes IEEE (float16, float32, float64), números complejos, cadenas, tipos compuestos, tipos enumerados
- Fragmentación (chunking): los conjuntos de datos pueden dividirse en trozos de tamaño fijo almacenados independientemente — crítico para E/S parcial eficiente en arrays grandes
- Compresión: por conjunto de datos, aplicada a nivel de trozo (zlib/DEFLATE, LZ4, Blosc, Bitshuffle)
- Dimensiones extensibles: los conjuntos de datos pueden crecer a lo largo de dimensiones marcadas tras su creación
Trabajar con HDF5 en Python: h5py
h5py es la interfaz Python estándar:
import h5py
import numpy as np
# Crear un archivo HDF5
with h5py.File('simulacion.h5', 'w') as f:
# Crear un grupo
grp = f.create_group('velocidad')
# Crear un conjunto de datos fragmentado y comprimido
datos = np.random.randn(1000, 256, 256).astype(np.float32)
dset = grp.create_dataset(
'componente_u',
data=datos,
chunks=(100, 64, 64), # forma del trozo
compression='gzip',
compression_opts=6 # nivel gzip 1-9
)
# Adjuntar atributos
dset.attrs['unidades'] = 'm/s'
dset.attrs['nombre_largo'] = 'Componente zonal de velocidad'
# Leer un archivo HDF5
with h5py.File('simulacion.h5', 'r') as f:
# Listar grupos de nivel superior
print(list(f.keys())) # ['velocidad']
# Acceder a un conjunto de datos (lazy — los datos no se cargan aún)
dset = f['velocidad/componente_u']
print(dset.shape, dset.dtype) # (1000, 256, 256) float32
# Lectura por rebanada: solo lee una parte, no el array completo
subconjunto = dset[0:10, 100:200, 100:200]
# Leer atributos
print(dset.attrs['unidades']) # b'm/s'
# Recorrer toda la estructura del archivo
f.visititems(lambda nombre, obj: print(nombre, type(obj).__name__))
Fragmentación y Compresión: Críticas para el Rendimiento
La fragmentación es la elección de configuración más importante de HDF5. Reglas generales:
- La forma del trozo debe coincidir con el patrón de acceso: si lees rebanadas temporales
[t, :, :], usa trozos(1, H, W)no(T, 1, 1) - Tamaño de trozo ~1 MB: el punto óptimo para E/S
- La compresión se aplica por trozo: solo los trozos necesarios se descomprimen en la lectura
- gzip/DEFLATE: universal, ~40–70% de reducción de tamaño en datos de punto flotante
- LZ4 / Blosc: descompresión mucho más rápida, ligeramente menor compresión — mejor para cargas de trabajo interactivas
- Bitshuffle + LZ4: óptimo para datos científicos de punto flotante
# Fragmentación óptima para acceso primero por tiempo
dset = f.create_dataset('temperatura',
shape=(10000, 1024, 1024),
dtype=np.float32,
chunks=(1, 1024, 1024), # una rebanada 2D completa por trozo
compression='lzf', # compresión rápida
shuffle=True # mezcla de bytes mejora el ratio
)
HDF5 en los Principales Ecosistemas Científicos
NetCDF-4
NetCDF-4 usa HDF5 como formato de almacenamiento subyacente. Abrir un archivo .nc NetCDF-4 con h5py funciona — se ve la misma jerarquía de grupos/conjuntos de datos.
Aprendizaje Automático: Keras / TensorFlow
Keras guarda los pesos del modelo en HDF5 (.h5/.keras):
model.save('modelo.h5')
model = tf.keras.models.load_model('modelo.h5')
Genómica: HDF5 en Bioinformática
- 10x Genomics datos de secuenciación de ARN de célula única: archivos
.h5 - AnnData respaldado por HDF5 (
anndata/scanpy): archivos.h5adpara análisis de célula única
Ciencia de Materiales: NeXus
- NeXus (
.nxs): formato basado en HDF5 para datos de dispersión de neutrones y rayos X
Herramientas de Línea de Comandos
# Inspeccionar la estructura del archivo
h5ls -r simulacion.h5 # listado recursivo
h5dump -n simulacion.h5 # solo nombres/estructura
# Reempaquetar (recomprimir/refragmentar)
h5repack -i entrada.h5 -o salida.h5 \
-f /velocidad/componente_u:CHUNK=1x256x256 \
-f /velocidad/componente_u:GZIP=6
Consejos Prácticos
- Usa siempre fragmentación para conjuntos de datos > 1 MB — los conjuntos de datos contiguos no fragmentados no pueden comprimirse y requieren leer el array completo para cualquier acceso
- Adapta la forma del trozo al patrón de lectura — la fragmentación incorrecta es el problema de rendimiento número 1 en HDF5
- Usa
h5py.Filecomo gestor de contexto (sentenciawith) — garantiza el cierre correcto del archivo - Codificación de cadenas: h5py ≥ 3.0 devuelve bytes por defecto; usa
dset.asstr()[...]para cadenas Unicode - SWMR (Single Writer Multiple Reader): HDF5 1.10+ soporta el modo SWMR para leer mientras se escribe — útil para flujos de datos de instrumentos en vivo
- Inspecciona con HDFView (GUI gratuita de The HDF Group) o h5web (basado en web, sin instalación)
La combinación de organización jerárquica, metadatos autodescriptivos, fragmentación, compresión y E/S paralela de HDF5 lo convierte en el contenedor universal para datos científicos a cualquier escala.
Conversiones relacionadas
Conversiones frecuentes del catálogo: