Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

190
Visualizações
¿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 à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda