Переполнение памяти node js при большом количестве запросов mongodb
Всем доброго времени суток. Столкнулся с такой проблемой, при чтении dbf файлов и записи построчно в mongodb память скриптом съедается очень быстро вне зависимости от ее количества. Пробовал отключать валидацию mongoose и добавить таймауты для запросов, такое ощущение что память не очищается самостоятельно. Возможно у меня ошибка в коде, но я ее не вижу.
Код для подключения к базе и вызова функции чтения
const mongoose = require('mongoose');
const Controller = require('./controller/db');
const config = require('../config/dir_config.json');
async function updateBase() {
console.log('Start update database.');
let connection = mongoose.connect('mongodb://' + config.mongo.url + ':' + config.mongo.port + '/' + config.mongo.db.fias, options.dev);
if (!connection) {
return console.log('Error connection to database.');
}
let dataPromise = file_parse.getFileList(dbf_repo);
dataPromise.then(async function (file_array) {
console.log('Get array files.');
for (let file of file_array) {
console.log('Start parse file: ' + file.name + '.');
let table_name = file.name.replace(/(\d)/gmu, '');
await Controller.UpdateData(dbf_repo, table_name, file);
console.log('End parse file: ' + file.name + '.');
}
console.log('Update complete!');
}, function (err) {
throw err;
});
}
Код функции чтения dbf и записи в базу:
const mongoose = require('mongoose');
const DBF = require('stream-dbf');
module.exports.UpdateData = async function (file_directory, table_name, file) {
return new Promise(async function (resolve, reject) {
let Model = require('../../../models/' + table_name);
let parser = new DBF(file_directory + '/' + file.name + '.' + file.format, {encoding: 'ibm866'});
let array = [];
parser.stream.on('data', function (record) {
array.push(record);
});
parser.stream.on('end', function () {
if (array.length > 0) {
for (let document of array) {
Model.findOneAndUpdate({[Model.IdName()]: document[Model.IdName()]}, document, {
new: true,
upsert: true,
}, function (err) {
if (err) {
console.log(err);
reject();
}
});
}
array = null;
resolve();
} else {
console.log('Array is empty');
resolve();
}
});
})
};