3 respostas

★ Melhor resposta

Eu tenho problemas assim com bases de dados enormes e a culpa é quase sempre a mesma: tu tás a carregar o ficheiro inteiro na memória antes de processar! Um CSV de 500MB fica absolutamente monstruoso quando parseado em arrays, e aumentar heap é só colocar um adesivo numa ferida. A solução real é usar streams - processa linha a linha enquanto vais escrevendo os dados numa base de dados ou ficheiro, e o Node.js nem vai precisar guardar mais do que alguns KB à vez! Experimenta com a library `csv-parser` com streams ou até escrever um parser customizado com `fs.createReadStream()` e eventos, que isto muda completamente o teu jogo.

Já passei por algo parecido quando tentava processar ficheiros grandes de uma vez e percebi que o problema não era só memória - era o facto de estar a carregar tudo de uma vez no RAM. Com um CSV de 500MB, se tentares ler o arquivo inteiro e depois processar, vais ficar sem memória rapidinho. A solução é usar streams em vez de carregar tudo para memória. No Node.js tens o módulo `fs.createReadStream()` que te permite ler o ficheiro aos bocadinhos. Se estiveres com bibliotecas tipo `csv-parser`, consegues encadear streams para processar linha a linha sem sobrecarregar a RAM.

Outra coisa que mudou para mim foi perceber que até com streams, se a tua lógica de processamento for lenta (tipo operações síncronas no loop, queries à BD sem batch), vais criar um gargalo. Quando o stream fornece dados mais rápido do que tu consegues processar, a memória acumula à mesma. Usa `pause()` e `resume()` para controlar o fluxo, ou implementa back-pressure adequadamente. Se estiveres a fazer queries à base de dados para cada linha, mete-as em batch - tipo, agrupa 1000 linhas e faz uma só operação em vez de 1000 separadas.

Qual é mais ou menos a operação que estás a fazer com os dados do CSV? E estás a guardar os resultados nalgum lado (ficheiro, base de dados) ou só a processar e devolver pela API? A resposta ajuda porque o problema pode estar também na forma como estás a enviar a resposta ao cliente.

gabriel_oliveira asker Tô processando os dados e salvando direto no banco, sem batch. Vou testar com streams e agrupar as queries em lotes de 1000, valeu!

O problema provavelmente não é só aumentar heap, não. Quando você carrega um arquivo de 500MB inteiro na memória antes de processar, o Node.js fica sufocado mesmo. A galera tá certa em apontar isso, mas tem um detalhe que ninguém mencionou: se você tá usando bibliotecas como `csv-parser` ou similar sem configurar streams direito, ela pode estar fazendo buffer de várias linhas antes de processar, o que piora tudo. Você precisa usar streams de verdade - `fs.createReadStream()` + um parser que respeite chunks pequenos. Desse jeito o Node.js processa linha por linha (ou em pequenos lotes) sem derrubar a memória.

Outra coisa que mata: se tá fazendo consultas no banco de dados dentro do loop de processamento do CSV, cada linha pode estar gerando uma query separada. Imagina 500 mil linhas = 500 mil queries. O banco fica em pânico, a fila cresce, memória explode. Bota isso em batch - processa 1000 linhas de uma vez, faz um insert em lote, depois vai pra próxima. Com streams + batching você consegue processar arquivos muito maiores sem travar.

Sua resposta

Entrarpara responder.