Saltar al contenido
JSONCraft

Rendimiento

Procesa JSON grande: filtro NDJSON ejecutable

Filtra registros sin cargar una exportación completa, reproduce la salida y conoce los límites de memoria y errores del streaming.

El streaming sirve cuando puedes terminar un registro antes de leer el siguiente. No vuelve pequeña cualquier operación: ordenar todos los registros, conservar un array de resultados o leer un único registro enorme sigue consumiendo memoria.

Reproduce un filtro de usuarios adultos

Descarga users.ndjson y filter-ndjson.mjs en el mismo directorio. La entrada contiene tres usuarios sintéticos:

{"id":1,"name":"Ana","age":28}
{"id":2,"name":"Ben","age":16}
{"id":3,"name":"Cyr","age":20}

Con Node 22 o posterior:

node filter-ndjson.mjs users.ndjson

Salida esperada:

{"id":1,"name":"Ana","age":28}
{"id":3,"name":"Cyr","age":20}

El script descargable utiliza streams incluidos en Node. Lee fragmentos UTF-8, conserva la línea incompleta entre fragmentos, comprueba el límite de ejemplo de 64 KiB por registro, parsea cada registro y espera si la salida aplica contrapresión. Admite una última línea sin salto final y no acumula todos los usuarios en un array.

NDJSON contiene un valor JSON completo por línea. Un salto escapado dentro de un string es válido; un objeto con sangría repartido en varias líneas físicas no es este formato. El script ignora líneas vacías. Un registro mal formado o una edad inválida hace fallar la ejecución; puede haber salida parcial ya escrita. Si eso resulta engañoso para tu proceso, escribe en un destino temporal y publícalo sólo tras una salida correcta.

Un array JSON requiere otro parser

Para { "users": [...] }, separar por saltos de línea no funciona. Usa un parser incremental del lenguaje o cambia una exportación que controles a NDJSON. Las APIs que entregan un objeto cada vez siguen materializando ese objeto; un campo enorme puede superar el presupuesto de memoria.

jq --stream emite eventos de ruta/valor, no usuarios completos. Para el equivalente con array, esta consulta reconstruye sus elementos antes de filtrar:

jq -nc --stream 'fromstream(2|truncate_stream(inputs)) | select(.age >= 18)' users.json

users.json debe tener exactamente la forma {"users":[...]}, con objetos de usuario en ese array. El argumento de profundidad corresponde a esa estructura, no es un extractor universal. Consulta la referencia de streaming de jq antes de adaptarlo.

Decide por carga de trabajo

Mide el registro más grande, el anidamiento, los buffers del destino y la memoria disponible. Un navegador móvil y un worker de servidor tienen presupuestos distintos. Para inspeccionar una muestra, extráela localmente y abre ese JSON válido en el visor o el conversor JSON a CSV. Estas herramientas no se presentan como procesadores incrementales de varios gigabytes.

Referencias: streams de Node y ijson para Python, cuyo backend y comportamiento numérico debes comprobar en tu entorno. La compresión es una decisión separada: consulta el benchmark de compresión.

Herramientas relacionadas

Preguntas frecuentes

¿gzip reduce la memoria que usa JSON.parse?

No. El documento se descomprime y se materializa antes de obtener el resultado del parseo.

¿Puedo pegar NDJSON como un único documento en JSONCraft?

No. Varios valores JSON independientes no constituyen un único documento JSON. Extrae primero un registro o un array pequeño.

Por