Ho avuto un'esperienza simile quando cercavo di processare file grandi tutto in una volta e mi sono resa conto che il problema non era solo la memoria - era il fatto di caricare tutto insieme nella RAM. Con un CSV di 500MB, se provi a leggere l'intero file e poi elaborarlo, ti rimani senza memoria in fretta. La soluzione è usare gli stream invece di caricare tutto in memoria. In Node.js hai il modulo `fs.createReadStream()` che ti permette di leggere il file a pezzetti. Se stai usando librerie tipo `csv-parser`, riesci a concatenare gli stream per elaborare riga per riga senza sovraccaricare la RAM.
Un'altra cosa che è cambiata per me è stata capire che anche con gli stream, se la tua logica di elaborazione è lenta (tipo operazioni sincrone nel loop, query al database senza batch), crei un collo di bottiglia. Quando lo stream fornisce dati più velocemente di quanto tu riesca a elaborare, la memoria si accumula comunque. Usa `pause()` e `resume()` per controllare il flusso, oppure implementa il back-pressure correttamente. Se stai facendo query al database per ogni riga, raggruppale in batch - tipo, raggruppa 1000 righe e fai un'operazione sola invece di 1000 separate.
Più o meno quale operazione stai facendo con i dati del CSV? E stai salvando i risultati da qualche parte (file, database) oppure solo elaborando e restituendo tramite API? La risposta aiuta perché il problema potrebbe essere anche nel modo in cui stai inviando la risposta al client.