У меня есть некоторые опасения по поводу проблемы с производительностью. У меня есть cron, который запускается каждую минуту и обновляет коллекцию.
Каждую минуту 10 000 новых транзакций извлекаются из внешнего API. Некоторые из этих записей транзакций уже есть в моей базе данных.
for (transaction in transactions) {
if (Transaction.findOne(_id: transactionId, { _id: 1}))
console.log("Already in db");
else
Transaction.insert(transaction)
Чтобы ускорить это, я загрузил полную коллекцию в память и вставил ее только в конец моего скрипта.
const toInsert = [];
const transactions = await Transaction.find().select(_id);
// I transform array of transactions to an object of transaction where key is _id, thus i can avoid using a find at every iteration
const transactionsObject = transactions.reduce((obj, transaction) => {
obj[transaction.id] = true;
return obj;
}, {})
for (transaction in transactions) {
if (transactionsObject[transactionId])
console.log("Already in db");
else {
toInsert.push(transaction);
transactionsObject[transaction._id] = true;
}
Transaction.insertMany(toInsert);
С этой версией моего скрипта, скрипт очень быстрый, но у меня есть некоторые опасения по поводу масштабируемости, потому что мне понадобится много памяти, и если мне понадобится поточить это, мне нужно будет разделить все между потоками.
Как бы вы оптимизировали скрипт?