nodejs che esaurisce la memoria che processa i file CSV

Ho letto una serie di domande SO su nodejs che stanno esaurendo la memoria, ma non ho visto nulla di simile alla mia situazione.

Sto cercando di elaborare circa 20 GB di dati su 250 file CSV (quindi ~ 80 MB / file). Avvia lo script del nodo con --max-old-space-size=8192 su un server con 90 GB di memoria libera utilizzando il nodo v5.9.1. Dopo 9 minuti di elaborazione, lo script si chiude con un errore di memoria insufficiente.

Sono nuovo alla programmazione dei nodes, ma pensavo di aver scritto lo script per elaborare i dati una riga alla volta e di non conservare nulla in memoria. Tuttavia, sembra che alcuni riferimenti a oggetti siano trattenuti da qualcosa, quindi la sceneggiatura sta perdendo memoria. Ecco la sceneggiatura completa:

 var fs = require('fs'); var readline = require('readline'); var mongoose = require('mongoose'); mongoose.connect('mongodb://buzzard/xtra'); var db = mongoose.connection; db.on('error', console.error.bind(console, 'connection error:')); var DeviceSchema = mongoose.Schema({ _id: String, serial: String }); var Device = mongoose.model('Device', DeviceSchema, 'devices'); function processLine(line) { var serial = line.split(',')[8]; Device({ _id: serial, serial: serial }).save(function (err) { if (err) return console.error(err); }); } function processFile(baseDir, fileName) { if(!fileName.startsWith('qcx3')) return; var fullPath = `${baseDir}/${fileName}`; var lineReader = readline.createInterface({ input: fs.createReadStream(fullPath) }); lineReader.on('line', processLine); } function findFiles(rootDir) { fs.readdir(rootDir, function (error, files) { if (error) { console.log(`Error: ${error}` ); return } files.forEach(function (file) { if(file.startsWith('.')) return; var fullPath = `${rootDir}/${file}`; fs.stat(fullPath, function(error, stat) { if (error) { console.log(`Error: ${error}` ); return; } if(stat.isDirectory()) dir(fullPath); else processFile(rootDir, file); }); }); }) } findFiles('c://temp/logs/compress'); 

Ho anche notato che quando eseguo lo script su un set di test molto più piccolo che può completare completamente l’elaborazione, lo script non esce alla fine. Continua a rimanere lì finché non ctrl + c it. Questo potrebbe essere in qualche modo correlato?

Che cosa sto facendo di sbagliato?

    1. Lo script non si sta esaurendo perché hai una connessione aperta con mangusta, dopo che tutti i file sono stati elaborati devi chiudere la connessione e lo script finirà.
    2. Hai l’idea giusta di utilizzare gli stream ma penso che ti sia sfuggito qualcosa in arrivo, ti suggerisco il seguente articolo per aggiornare lo streamInterface e gli eventi. https://coderwall.com/p/ohjerg/read-large-text-files-in-nodejs

    3. Un’altra fonte di problemi potrebbe essere il mongodb, sembra che tu faccia molti inserti, potrebbe essere collegato con il massimo di I / O di mongodb che esaurisce la memoria.