[英]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.