更新性能非常慢

时间:2016-05-03 12:19:25

标签: node.js mongodb monk

我正在解析一个CSV文件,对于每一行我想检查数据库中是否存在相应的条目,如果是,我想更新它,如果它不想输入新条目。

非常慢 - 每秒只有大约30个条目。

我做错了什么?

使用node,mongodb,monk

 function loadShopsCSV(ShopsName) {
    var filename = 'test.csv'

        csv
            .fromPath(filename)
            .on("data", function(data) {               
                           var entry = {
                                PeriodEST: Date.parse(data[0]),
                                TextDate: textDateM,
                                ShopId: parseInt(data[1]),
                                ShopName: data[2],
                                State: data[3],
                                AreaUS: parseInt(data[4]),
                                AreaUSX: AreaUSArray[stateArray.indexOf(data[3])],
                                ProductClass: data[5],
                                Type: data[6],
                                SumNetVolume: parseInt(data[7]),                                
                                Weekday: weekdayNum,                              
                                WeightedAvgPrice: parseFloat(data[8]),

                            }


                            db.get(ShopsDBname).update(
                                {"PeriodEST" : entry.PeriodEST,
                                 "ShopName": entry.ShopName,
                                 "State" : entry.State,
                                 "AreaUS" : entry.AreaUS,
                                 "ProductClass" : entry.ProductClass,
                                 "Type" : entry.Type},
                                  {$set : entry},
                                  function(err, result) {

                                  }
                            );
                    }
                }
            })
            .on("end", function() {
                console.log('finished loading: '+ShopsName)
            });
    }, function(err) {
        console.error(err);
    });
}

2 个答案:

答案 0 :(得分:1)

首先我建议本地化问题:

  • 用虚拟.on("data", function(data)替换.on("data", function() {return;})并确认csv解析的速度。
  • 启用mongo profiler db.setProfilingLevel(1),如果有任何查询慢于100毫秒,请检查慢速日志。

如果上面没有问题 - 瓶颈在你用来准备和发送查询的一个nodejs库中。

假设问题在于mongodb查询速度慢,您可以使用explain进行更新查询以获取详细信息。可能是它不使用任何索引并为每次更新运行表扫描。

最后,建议使用专为您的用例而设计的bulk操作。

答案 1 :(得分:0)

您是否尝试过更新而没有写入问题?当MongoDB阻塞,直到整个更新成功并且DB发回该确认?你是集群还是什么? (如果是的话,可能想写入主节点)

在你的{$ set:entry}之后

{writeConcern:{w:0}}