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

我还在学习mongodb和node.js。

我试图插入大量的数据说80k + 100k行。 我为此创build了一个使用express.js的应用程序。 我编码的方式,一旦上传button被点击后页面redirect到另一个页面,在后台应用程序插入数据到数据库。

问题是一旦插入开始应用程序停止响应。 即使在插入应用程序完成后,将会更慢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的结果
  • 标题是具有键 – 数据types映射的对象

    var headers = {'iodate':'date','sno':'integer','salary':'float'}

代码来读取和转换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. } }) 

现在,即使插入尚未完成,“persists()”仍会以亚氨酸forms返回。 这是由于javascript / nodejs的asynchronous性质。

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

你的“persists”函数应该使用callback来通知调用者它已经完成。 喜欢这样的:

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