nodejs ficando sem memória processando arquivos csv
Eu li várias perguntas de SO sobre nodejs ficando sem memória, mas não vi nada que parecesse com a minha situação.
Estou tentando processar cerca de 20 GB de dados em arquivos de 250 csv (então ~ 80 MB / arquivo). Ative o script do nó com--max-old-space-size=8192
em um servidor com 90 GB de memória livre usando o nó v5.9.1. Após 9 minutos de processamento, o script é encerrado com um erro de falta de memória.
Eu sou novo na programação de nós, mas pensei em escrever o script para processar dados uma linha de cada vez e não manter nada na memória. No entanto, parece que algumas referências a objetos estão sendo mantidas por algo, então o script está vazando memória. Aqui está o script completo:
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');
Também notei que, quando executo o script em um conjunto de testes muito menor, para que ele possa concluir completamente o processamento, o script não sai no final. Apenas fica pendurado até eu pressionar Ctrl + C. Isso poderia estar de alguma forma relacionado?
O que estou fazendo errado?