Performance mongodb插入时节点应用程序不工作

Performance mongodb插入时节点应用程序不工作,performance,node.js,mongodb,bulkinsert,Performance,Node.js,Mongodb,Bulkinsert,我还在学习mongodb和node.js 我试图插入大量数据,比如说10万行80-100列。为此,我使用express.js创建了一个应用程序。我的编码方式是,一旦点击上传按钮,页面就会重定向到另一个页面,在后台,应用程序会将数据插入数据库 问题是一旦插入启动,应用程序就会停止响应。即使在完成“插入”操作后,应用程序的速度也会减慢约2-3分钟 我试过这个密码 一, 软呢帽14 英特尔P4 2.80GHz 1.5GB 二, 软呢帽14 i3.20GHz 3GiB 如何避免这个问题?它会在一

我还在学习mongodb和node.js

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

问题是一旦插入启动,应用程序就会停止响应。即使在完成“插入”操作后,应用程序的速度也会减慢约2-3分钟

我试过这个密码

一,

  • 软呢帽14
  • 英特尔P4 2.80GHz
  • 1.5GB
二,

  • 软呢帽14
  • i3.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));
            }
        });    
    }
});
现在,“persistents()”立即返回,即使插入尚未完成。这是由于javascript/nodejs的异步特性造成的

您需要序列化insert操作,以免阻塞服务器。使用async.eachSeries()

“persistens”函数应该使用回调来通知调用方它已经完成。像这样的事情:

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");
});

jsonResult
来自哪里?这是读取文件的结果吗。@NeilLunn Yes通过使用module
convert json
Yeah读取csv文件。您是否可以在读取csv文件和执行转换的位置包含代码。这样人们就可以看到你在那里为之奋斗。有一个更好的方法可以做到这一点。@NeilLunn Oh ok sure:)@NeilLunn用用于csv到json转换的代码片段更新了代码。这不是要等到函数结束吗?我希望插入在后台运行,而不会干扰应用程序。您提到您正在使用express.js,因此我假设您有一个webapp。在这种情况下,由于nodejs的非阻塞性,http调用被“并发”执行;加载另一个页面。问题可能出在服务器代码中。你能邮寄吗?你要哪一份?
persists(req, res, result, collectionName, headers, function(){
    console.log("insert finished");
});