Сделайте 1 миллион многопоточных вставок в MongoDb, используя Node JS скриптов - PullRequest
0 голосов
/ 05 мая 2020

У меня есть изолированный сервер 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 срабатывают при сохранить

...