簡體   English   中英

mongo中的批量處理速度非常慢,無法記錄一百萬條記錄

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM