У меня есть изолированный сервер syn c, который извлекает текстовый файл с ограничением по табуляции с внешнего ftp-сервера и обновляет (сохраняет) в mongodb после обработки. Мой код выглядит так:
//this function pulls file from external ftp server
async function upsteamFile() {
try {
let pythonProcess = spawn('python3', [configVar.ftpInbound, '/outbound/Items.txt', configVar.dataFiles.items], {encoding: 'utf8'});
logger.info('FTP SERVER LOGS...' + '\n' + pythonProcess.stdout);
await readItemFile();
logger.info('The process of file is done');
process.exit();
} catch (upstreamError) {
logger.error(upstreamError);
process.exit();
}
}
//this function connects to db and calls processing function for each row in the text file.
async function readItemFile(){
try{
logger.info('Reading Items File');
let dataArray = fs.readFileSync(configVar.dataFiles.items, 'utf8').toString().split('\n');
logger.info('No of Rows Read', dataArray.length);
await dbConnect.connectToDB(configVar.db);
logger.info('Connected to Database', configVar.db);
while (dataArray.length) {
await Promise.all( dataArray.splice(0, 5000).map(async (f) => {
splitValues = f.split('|');
await processItemsFile(splitValues)
})
)
logger.info("Current batch finished processing")
}
logger.info("ALL batch finished processing")
}
catch(PromiseError){
logger.error(PromiseError)
}
}
async function processItemsFile(splitValues) {
try {
// Processing of the file is done here and I am using 'save' in moongoose to write to db
// data is cleaned and assigned to respective fields
if(!exists){
let processedValues = new Products(assignedValues);
let productDetails = await processedValues.save();
}
return;
}
catch (error) {
throw error
}
}
upstream()
Таким образом, обработка 100 000 тысяч строк и обновление их в базе данных занимает около 3 часов. Есть ли способ ускорить это. Я очень ограничен в аппаратном обеспечении. Я использую сервер linux на основе экземпляра ec2 с 2 ядрами и 4 ГБ оперативной памяти. Следует ли мне использовать рабочие потоки, такие как microjob , для запуска многопоточности. если да, то как мне go сделать это Или это максимальная производительность?
Примечание: я не могу выполнить массовое обновление в mongodb, так как есть mon goose pre hooks срабатывают при сохранить