Используемые модули:
const Bluebird = require('bluebird');
const fileSystem = Bluebird.promisifyAll(require('graceful-fs'));
const pathModule = require('path');
const xmlParser = Bluebird.promisifyAll(require('xml2js'));
Проблема
Нужно обработать много XML файлов. Создал функцию для получения списка всех путей:
function collectFilePaths(basePath) {
return fileSystem.readdirAsync(basePath)
.then(function(items) {
return items.filter(function(item) {
return fileSystem.statSync(pathModule.join(basePath, item)).isDirectory();
});
})
.map(function(folder) {
let folderPath = pathModule.join(basePath, folder);
return fileSystem.readdirAsync(folderPath)
.filter(function(fileName) {
return pathModule.extname(fileName) === '.XML';
})
.map(function(fileName) {
return pathModule.join(basePath, folder, fileName);
});
})
.reduce(function(result, current) {
return result.concat(current);
});
}
Функции для чтения и парсинга:
function loadFileContent(filePath) {
return fileSystem.readFileAsync('./' + filePath)
.then(function(content) {
return content;
});
}
function convertXmlToObject(xmlData) {
return xmlParser.parseStringAsync(xmlData)
.then(function(result) {
return result;
});
}
Когда запускаю обработку всех файлов (более 20 тысяч), получаю ошибку нехватки памяти:
collectFilePaths('./XMLFiles')
.map(function(filePath) {
loadFileContent(filePath)
.then(function(fileContent) {
convertXmlToObject(fileContent)
.then(function(parsedData) {
console.log(parsedData);
});
});
});
Ошибка: FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
Одиночный файл обрабатывается нормально. В чем может быть проблема?