[英]Bulk processing in mongo is very slow for 1 million records
請考慮以下情形:
CSV文件由每個星期五的報告工具生成。 它包含組織中所有員工的記錄(近100萬名員工,並且正在不斷增加)。
此數據使用“員工”集合中的mongoimport保存在mongo中。
但是,要求是向新員工發送“歡迎郵件”,向現有員工發送“年度完成郵件”。
為了解決這個問題,我將新文件導入一個臨時集合(“ EmployeeTemp”)。
對於臨時集合(EmployeeTemp)中的每個記錄,我檢查現有雇員的舊集合(“ Employee”),並將“ SendYearCompletionFlag”標記為true。 此外,如果找到新員工記錄,則將“ SendWelcomeFlag”標記為true。 另外,每個員工的項目都需要更新。
通過提交給mongo的腳本執行此完整過程。
問題是該腳本需要將近18個小時才能完成。
請幫助我減少腳本的執行時間。
這個腳本:
var list = db.employeeTemp.find().addOption(DBQuery.Option.noTimeout);
while(list.hasNext()){
var f = list.next();
var itr = db.employee.find({"eid":f.eid});
var obj = itr.hasNext() ? itr.next() : null;
if(!obj){
f.joiningDate = new Date();
f.sendWelcomeMail = true;
print("Saving New record : " + f.eid);
db.save(f);
} else {
var joinDate = obj.joiningDate;
if(new Date().getTime()-joinDate>=31536000000){
print("Sending Year Completion Mail to " + obj.eid)
obj.sendYearCompletionMail = true;
}
obj.projecct = f.project;
print("Saving Existing record : " + obj.eid);
db.save(obj);
}
}
我建議您在employee.eid上創建索引。
您可以嘗試做的另一件事是,在設置no timeout選項后,首先找到添加batchSize(500)的方法來更改批量大小:
http://docs.mongodb.org/manual/reference/method/cursor.batchSize/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.