Engine de processamento de CSV de alta performance projetada para lidar com arquivos de múltiplos gigabytes com consumo de memória baixo e constante. Utilizando Node.js Streams e Backpressure, previne falhas de “Out-of-Memory” (OOM) comuns em implementações ingênuas.
Um cenário comum em backends Node.js:
produtos.csv (500MB, 2 milhões de linhas).fs.readFile).FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory. O servidor trava e derruba todas as conexões ativas.Este projeto resolve isso tratando os dados como um Fluxo (Flow), e não como um Bloco.

flowchart LR
Client[Upload do Cliente]
filesys[Busboy Stream]
parser[CSV Parser]
batcher[Processador em Lote]
db[(MongoDB)]
Client -->|Stream MultiPart| filesys
filesys -->|Pipe| parser
parser -->|Linha a Linha| batcher
subgraph Protecao de Memoria [Node.js Pipeline]
direction TB
batcher -- "Buffer Cheio (1k linhas)" --> db
db -. "Ack (Backpressure)" .-> batcher
batcher -. "Pausar Leitura" .-> parser
end
stream.pipeline para garantir limpeza correta e tratamento de erros. Se a requisição for abortada, a stream do arquivo fecha imediatamente.bulkWrite, aumentando o Throughput em ~50x.@fastify/multipart (Wrapper do Busboy)csv-parse (Parser compatível com Streams)npm install
# Iniciar MongoDB (se usar Docker)
docker-compose up -d
# Iniciar Aplicação
npm run dev
Em vez de buscar manualmente um CSV gigante, utilize os scripts inclusos para gerar e enviar um arquivo de teste.
A. Gerar CSV de 100MB
npx ts-node scripts/generate-csv.ts
Cria o arquivo large_file.csv na raiz do projeto (100MB).
B. Upload via Stream para o Servidor
npx ts-node scripts/test-upload.ts
Este script faz o streaming do arquivo (prevenindo OOM no cliente) e loga a resposta do servidor.
Observe os Logs:
[Progress] Processed: 10000 | Failed: 0 | Heap: 42MB
[Progress] Processed: 20000 | Failed: 0 | Heap: 43MB <-- Memória Estável!
Para visualizar a eficiência de memória em tempo real sem ferramentas externas:
test-client.html no seu navegador (arraste e solte o arquivo).npm run upload.| Limitação | Solução na v2.0 |
|---|---|
| Single Node | Funciona em um único servidor. Para processamento distribuído, precisaríamos enviar o arquivo para o Amazon S3 primeiro e acionar um Worker SQS. |
Gérson Resplandes Backend Engineer focado em Performance e Arquiteturas de Stream.