performance - node app not working while mongodb is inserting -
i'm still learning mongodb , node.js.
i trying insert bulk amount of data 100k rows 80-100 columns. created app using express.js that. coded in such a way page redirects page once upload button clicked , in background app inserts data db.
the issue once inserting starts app stops responding. after completion of insert app slower 2-3 minutes.
i tried code on
1
- fedora 14
- intel p4 2.80ghz
- 1.5gib
2
- fedora 14
- i3 3.20ghz
- 3gib
how avoid problem? work better on better system?
code store data
mongoclient.connect(mongodb_uri, function (err, database) { var collection = database.collection(collectionname); (index = 0; index < jsonresult.length; ++index) { var obj = jsonresult[index]; (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)); } }); } }); note:
- jsonresult result of reading file(csv) , converting json
headers object have key-data type mapping
var headers = { 'iodate': 'date', 'sno': 'integer', 'salary': 'float' }
code read , convert csv json
var cv_json = require('convert-json'); // required module convert-json (convert-csv,xls,xlsx json) cv_json({ input: target_path, output: null }, function (err, result) { if (err) { console.error(err); } else { persists(req, res, result, collectionname, headers); //function insert takes place. } })
right now, "persists()" return imidiately, though insert hasn't finished. due asyncronus nature of javascript/nodejs.
you need serialize insert operations don't clog server. use async.eachseries()
your "persists" function should use callback notify caller has finished. somehing this:
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){ (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(); } ); }); } and use
persists(req, res, result, collectionname, headers, function(){ console.log("insert finished"); });
Comments
Post a Comment