Procesa 50 millones de filas sin OOM: Query Streaming por bloques.
Día 09 de la serie técnica WClickHouse Open Source.
No necesitas 64GB de RAM para procesar millones de registros de ClickHouse en Python. WClickHouse query_stream() mantiene tu consumo de memoria bajo 80MB.
Los Problemas Reales
- El OOM killer matando contenedores de Python al consultar resultados grandes
- fetchall() cargando 10GB de datos de una consulta en la RAM de golpe
- Arranques lentos esperando que termine toda la query antes de procesar la primera fila
La Implementación
db = WClickHouse(SensorReading, db_config)
# Stream 50 million rows in 50,000-row chunks: RAM never exceeds 80MB!
for chunk in db.query_stream("SELECT * FROM sensorreading", chunk_size=50000):
process_batch(chunk)
print(f"Processed chunk of {len(chunk)} rows cleanly.")
Por qué esta arquitectura gana
- Generador Lazy: query_stream() entrega bloques (ej. 50.000 filas) bajo demanda.
- RAM Constante: La memoria se mantiene bajo 80MB ya sean 10k o 50M de filas.
- Inmediatez: Comienza a procesar lógica en cuanto llega el primer bloque.
Verificación y Estado
Probado y verificado contra instancias reales de ClickHouse con más de 95% de cobertura de tests. Desarrollado para Python 3.9 a 3.14 con Apache Arrow y Pydantic v2.
Top comments (0)