mongodb插入时节点应用程序无法正常工作

时间:2014-03-12 06:00:03

标签: performance node.js mongodb bulkinsert

我还在学习mongodb和node.js。

我试图插入大量数据,表示100k行,80-100列。我使用express.js创建了一个应用程序。我编码的方式是,一旦点击上传按钮,页面就会重定向到另一个页面,而在后台,应用程序会将数据插入到数据库中。

问题是一旦插入开始,应用程序就会停止响应。即使在完成插入后,应用程序也会变慢约2-3分钟。

我在

上尝试了这段代码

1

  • Fedora 14
  • Intel P4 2.80GHz
  • 1.5GiB

2

  • Fedora 14
  • i3 3.20GHz
  • 3GiB

如何避免这个问题?它会在更好的系统上更好地运作吗?

存储数据的代码

MongoClient.connect(MONGODB_URI, function (err, database) {
    var collection = database.collection(collectionName);
    for (index = 0; index < jsonResult.length; ++index) {
        var obj = jsonResult[index];
        for (var prop in obj) {
            if (headers[prop] == 'Date') {
                obj[prop] = new Date(obj[prop].replace(/(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3"));
            } else if (headers[prop] == 'Integer') {
                obj[prop] = parseInt(obj[prop]);
            } else if (headers[prop] == 'Float') {
                obj[prop] = parseFloat(obj[prop]);
            }
        }
        collection.insert(obj, function (err, result) {
            if (err) {
                console.log(JSON.stringify(err));
            }
        });    
    }
});

注意:

  • jsonResult是读取文件(csv)并转换它的结果 进入json
  • headers是一个具有键数据类型映射的对象

    var headers = {     '碘酸':'日期',     'sno':'整数',     '薪水':'浮动' }

读取和转换csv到json的代码

var cv_json = require('convert-json'); // required module convert-json (convert-csv,xls,xlsx into json)
cv_json({
    input: target_path,
    output: null
}, function (err, result) {
    if (err) {
        console.error(err);
    } else {
        persists(req, res, result, collectionName, headers);  //Function where insert takes place.
    }
})

1 个答案:

答案 0 :(得分:1)

现在,“persists()”会立即返回,即使插件尚未完成。这是由于javascript / nodejs的asyncronus性质。

您需要序列化插入操作,这样就不会阻塞服务器。使用async.eachSeries()

您的“持久性”功能应使用回调来通知调用者它已完成。像这样的事情:

persists(req, res, result, collectionName, headers, callback){
    MongoClient.connect(MONGODB_URI, function (err, database) {
        var collection = database.collection(collectionName);
        async.eachSeries(jsonResult, 
            function(obj, cb){
                for (var prop in obj) {
                    if (headers[prop] == 'Date') {
                        obj[prop] = new Date(obj[prop].replace(/(\d{2})-(\d{2})-(\d{4})/,"$2/$1/$3"));
                    } else if (headers[prop] == 'Integer') {
                        obj[prop] = parseInt(obj[prop]);
                    } else if (headers[prop] == 'Float') {
                        obj[prop] = parseFloat(obj[prop]);
                    }
                }
                collection.insert(obj, function (err, result) {
                    cb(err);
                });                    
            }, 
            function(err){
                callback();
            }
        );
    });
}

然后使用它

persists(req, res, result, collectionName, headers, function(){
    console.log("insert finished");
});