¿Qué es HDF5?
HDF5 (Hierarchical Data Format versión 5) es un formato de archivo versátil y de alto rendimiento para almacenar y gestionar conjuntos de datos grandes y complejos. Desarrollado por el Grupo HDF (originalmente en el National Center for Supercomputing Applications), HDF5 ha sido un pilar de la computación científica desde los años 80. Es utilizado por la NASA, el CERN, la NOAA, el ECMWF y prácticamente cada institución importante de computación científica para almacenar desde imágenes de satélite y modelos climáticos hasta datos de física de partículas e imágenes de resonancia magnética.
HDF5 no es solo un formato de archivo — es un modelo de datos jerárquico (como un sistema de archivos dentro de un archivo) combinado con un diseño de almacenamiento binario optimizado para arrays grandes y E/S paralela. Un único archivo HDF5 puede almacenar terabytes de datos organizados en una jerarquía estructurada de grupos, datasets y atributos de metadatos.
El modelo de datos HDF5
HDF5 organiza los datos usando tres conceptos fundamentales:
Grupos
Los grupos son como directorios en un sistema de archivos. Todo archivo HDF5 tiene un grupo raíz (/) y puede contener cualquier número de grupos anidados.
/ ← grupo raíz
├── /clima/ ← grupo
│ ├── /clima/temperatura ← dataset: array 3D (tiempo × lat × lon)
│ ├── /clima/precipitacion
│ └── /clima/velocidad_viento
├── /metadatos/
│ └── /metadatos/info_estacion
└── /satelite/
├── /satelite/banda_1 ← dataset: array 2D (filas × columnas)
└── /satelite/banda_2
Datasets
Los datasets son arrays N-dimensionales de datos — el contenedor de datos principal. Un dataset tiene:
- Una forma (dimensiones): ej.
(365, 721, 1440)para temperatura diaria a resolución global de 0,25° - Un tipo de dato: int8, int16, float32, float64, cadena, etc.
- Atributos: pares clave-valor de metadatos adjuntos al dataset
- Fragmentación y compresión opcionales
Atributos
Los atributos son pequeños valores de metadatos adjuntos a grupos o datasets. Almacenan unidades, sistemas de referencia de coordenadas, marcas de tiempo de creación, historial de procesamiento y cualquier otra información contextual.
Trabajar con HDF5 en Python
h5py — La interfaz Python estándar
# pip install h5py numpy
import h5py
import numpy as np
# --- Escritura ---
with h5py.File('datos_clima.h5', 'w') as f:
# Crear estructura de grupos
clima = f.create_group('clima')
# Crear datasets
n_tiempos, n_lat, n_lon = 365, 181, 360
temp = clima.create_dataset(
'temperatura',
shape=(n_tiempos, n_lat, n_lon),
dtype='float32',
chunks=(1, n_lat, n_lon), # un corte temporal por fragmento
compression='gzip',
compression_opts=4,
shuffle=True,
fillvalue=9.96921e+36 # valor centinela para datos faltantes
)
# Establecer atributos
temp.attrs['units'] = 'Kelvin'
temp.attrs['long_name'] = 'Temperatura del aire a 2m'
temp.attrs['valid_min'] = 180.0
temp.attrs['valid_max'] = 340.0
# Escribir datos
for dia in range(n_tiempos):
temp[dia, :, :] = np.random.uniform(250, 310, (n_lat, n_lon)).astype('float32')
# Atributos a nivel de archivo
f.attrs['Convenciones'] = 'CF-1.8'
# --- Lectura ---
with h5py.File('datos_clima.h5', 'r') as f:
# Inspeccionar estructura
print("Grupos:", list(f.keys()))
# Leer subconjunto (sin necesidad de cargar el dataset completo)
temp = f['clima/temperatura']
print(f"Forma: {temp.shape}, Tipo: {temp.dtype}")
# Leer enero (días 0-30), hemisferio norte (índice lat 91-180)
enero_hn = temp[0:31, 91:181, :]
print(f"Media enero HN: {enero_hn.mean():.2f} K")
# Leer atributos
print("Unidades:", temp.attrs['units'])
Inspeccionar archivos HDF5 desde la línea de comandos
# Herramientas HDF5 (de la biblioteca HDF5)
h5ls datos_clima.h5 # listar contenido de nivel superior
h5ls -r datos_clima.h5 # listado recursivo
h5dump -H datos_clima.h5 # imprimir esquema/cabecera completo
h5dump -d /clima/temperatura datos_clima.h5 # imprimir valores del dataset
Fragmentación y compresión
La fragmentación divide un dataset en trozos de tamaño regular almacenados independientemente. Esto permite:
- Leer un subconjunto de datos sin cargar el dataset completo
- Compresión aplicada por fragmento
- Escrituras eficientes en cualquier orden
# Con fragmentación y compresión
f.create_dataset('temperatura',
shape=(365, 721, 1440),
dtype='float32',
chunks=(1, 721, 1440), # un corte temporal por fragmento
compression='gzip',
compression_opts=4,
shuffle=True) # el filtro shuffle mejora enormemente la compresión de arrays numéricos
El filtro shuffle es una de las optimizaciones más importantes de HDF5: reordena los bytes de enteros/floats de múltiples bytes para que la misma posición de byte de elementos adyacentes sea contigua, mejorando dramáticamente la capacidad de gzip para encontrar patrones repetidos.
HDF5 vs NetCDF4
NetCDF4 (Network Common Data Form versión 4) está construido directamente sobre HDF5 — un archivo NetCDF4 es un archivo HDF5 válido con una convención específica para nomenclatura de variables, sistemas de coordenadas y atributos (las Convenciones CF). NetCDF4 es el formato estándar para datos atmosféricos y oceanográficos; HDF5 es el contenedor más de propósito general.
| Aspecto | HDF5 | NetCDF4 |
|---|---|---|
| Construido sobre | Biblioteca HDF5 | HDF5 |
| Convenciones | Ninguna incorporada | Convenciones CF (unidades, coordenadas) |
| Dominio | Científico general | Clima/Océano/Atmósfera |
| Herramientas | h5py, HDFView, h5dump | netCDF4-python, NCO, CDO, xarray |
HDF5 en aprendizaje automático
HDF5 ganó amplia adopción en aprendizaje automático a través del formato de guardado de modelos de Keras (.h5). El archivo HDF5 almacena la arquitectura del modelo (JSON) y los pesos de las capas como arrays flotantes tipados.
# Keras — guardar y cargar un modelo
modelo.save('mi_modelo.h5') # formato HDF5
modelo = tf.keras.models.load_model('mi_modelo.h5')
# HDF5 directo para grandes datasets de entrenamiento
with h5py.File('datos_entrenamiento.h5', 'r') as f:
X = f['caracteristicas'][:] # cargar todas las características
y = f['etiquetas'][:]
Cuándo usar HDF5
Usa HDF5 cuando:
- Almacenas arrays científicos multidimensionales grandes (clima, astronomía, imagen médica, salida de simulaciones)
- Necesitas organización jerárquica dentro de un único archivo
- Se requiere acceso aleatorio a subconjuntos de arrays grandes
- Se necesita lectura/escritura paralela desde múltiples procesos
- La interoperabilidad con software científico (MATLAB, R, Julia, Fortran) es necesaria
Considera alternativas cuando:
- Los datos son principalmente tabulares y analíticos (usa Parquet)
- El streaming en tiempo real es necesario (usa Avro, Kafka)
- El almacenamiento de objetos nativo en la nube es el patrón de acceso principal (Zarr es compatible con HDF5 pero está optimizado para la nube)
Conversiones relacionadas
Conversiones frecuentes del catálogo: