对于 100 万条记录,mongo 中的批量处理非常慢
Bulk processing in mongo is very slow for 1 million records
请考虑以下场景:
CSV 文件由报告工具每周五生成。它包含组织中所有员工的记录(近 100 万名员工,而且还在增加)。
此数据使用"员工"集合中的 mongoimport 保存在 mongo 中。
但是,要求是向新员工发送"欢迎邮件",向现有员工发送"年度完成邮件"。
为了解决这个问题,我将新文件导入临时集合("EmployeeTemp")。
对于临时集合 (EmployeeTemp) 中的每条记录,我检查旧集合("员工")中的现有员工,并将"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上创建一个索引。
您可以尝试的另一件事是在设置无超时选项后添加 batchSize(500) 的第一个查找中更改批大小:
http://docs.mongodb.org/manual/reference/method/cursor.batchSize/
相关文章:
- 可以't让我的if语句处理js中的html表单输入
- keyup事件处理程序更改焦点不适用于快速键入
- 如何使用jquery处理php循环通过元素
- angular.js没有'无法在PhoneGap中处理视图标记
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- 提示使用服务器端事件处理程序激活JavaScript
- javascript:如何在antlr生成的Lexer中进行错误处理
- 如何编写一个具有公共标头的批处理
- 在同一个服务工作者中处理service-worker.js有任何影响吗
- 如何处理node.js节点mongodb中的连接和查询队列
- 通过命令行/批处理文件打开页面时,将javascript代码注入Google Chrome
- 我使用ajax对我的网站的详细信息页面进行一些动态处理,但我得到了非常不好的结果
- 在 chrome 中处理 array.sort(?) 回调的空字符串非常慢
- 对于 100 万条记录,mongo 中的批量处理非常慢
- Clojuescrapt ajax.core没有单独的处理程序/回调,代码中的流非常精确,就好像代码是同步的一样
- jQuery能处理非常大的文档吗?
- 处理非常大的Javascript数组或对象
- Angular.js正在处理一个元素,但在一个非常相似的元素上却没有
- 如何处理非常相似的按钮,而不用为每个按钮使用一个函数
- 如何在js中处理一个非常大的数组