los nodejs se están quedando sin memoria procesando archivos csv

He leído varias preguntas de SO sobre los nodos que se están quedando sin memoria, pero no he visto nada que suene similar a mi situación.

Estoy tratando de procesar aproximadamente 20 GB de datos en 250 archivos csv (~ 80 MB / archivo). Inicie el script de nodo con--max-old-space-size=8192 en un servidor con 90 GB de memoria libre usando el nodo v5.9.1. Después de 9 minutos de procesamiento, el script se cierra con un error de falta de memoria.

Soy nuevo en la programación de Node, pero pensé que escribí el script para procesar datos de una línea a la vez y no para guardar nada en la memoria. Sin embargo, parece que algunas referencias a objetos están retenidas por algo, por lo que el guión está perdiendo memoria. Aquí está el guión 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');

También noté que cuando ejecuto el script en un conjunto de prueba mucho más pequeño que puede terminar completamente el procesamiento, el script no se cierra al final. Solo sigue colgando allí hasta que lo controlo. ¿Podría esto estar relacionado de alguna manera?

¿Qué estoy haciendo mal?

Respuestas a la pregunta(1)

Su respuesta a la pregunta