Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

192
Vistas
¿Cómo puedo almacenar un resultado de conjunto de datos grande por fragmentos en un archivo csv en nodejs?

Tengo una tabla mysql de aproximadamente 10 millones de registros, me gustaría enviar esos registros a un archivo csv usando NodeJs.

Sé que puedo hacer una consulta para obtener todos los registros, almacenar el resultado en una variable de formato json y enviarlos a un archivo csv usando una biblioteca como fastcsv junto con createWriteStream. Escribir el resultado en el archivo es factible usando una secuencia. Pero lo que quiero evitar es almacenar 10 millones de registros en la memoria (supongamos que los registros tienen muchas columnas).

Lo que me gustaría hacer es consultar solo un subconjunto del resultado (por ejemplo, 20k filas), almacenar la información en el archivo, luego consultar el siguiente subconjunto (las próximas 20k filas) y agregar los resultados al mismo archivo y continuar con el proceso hasta que termine. El problema que tengo ahora mismo es que no sé cómo controlar la ejecución para la próxima iteración. Según la depuración, se ejecutan diferentes operaciones de escritura al mismo tiempo debido a la naturaleza asíncrona de nodejs, lo que me da un archivo donde se mezclan algunas líneas (múltiples resultados en la misma línea) y registros desordenados.

Sé que el tiempo total de ejecución se ve afectado con este enfoque, pero en este caso prefiero una forma controlada y evito el consumo de RAM.

Para la consulta de la base de datos, estoy usando Sequelize con MySQL, pero la idea es la misma independientemente del método de consulta.

Este es mi código hasta ahora:

 // Store file function receives: // (String) filename // (Boolean) headers: first iteration is true to put a name to the columns // (json document) jsonData is the information to store in te file // (Boolean) append: Disabled the first iteration to create a new file const storeFile = (filename, headers, jsonData, append) => { const flags = append === true ? 'a' : 'w' const ws = fs.createWriteStream(filename, { flags, rowDelimiter: '\r\n' }) fastcsv .write(jsonData, { headers }) .on('finish', () => { logger.info(`file=${filename} created/updated sucessfully`) }) .pipe(ws) } // main let filename = 'test.csv' let offset = 0 let append = false let headers = true const limit = 20000 const totalIterations = Math.ceil(10000000/ limit) for (let i = 0; i < totalIterations; i += 1) { // eslint-disable-next-line no-await-in-loop const records = await Record.findAll({ offset, limit, raw: true, }) storeFile(filename, headers, records, append) headers = false append = true offset += limit // offset is incremented to get the next subset }
about 4 years ago · Juan Pablo Isaza
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda