DEV Community

William Rodriguez
William Rodriguez

Posted on

Procesa 50 millones de filas sin OOM: Query Streaming por bloques.

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.")
Enter fullscreen mode Exit fullscreen mode

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.

ClickHouse #Python #DataEngineering #OLAP #BigData #Wisrovi

Top comments (0)