在nodejs中保存很多logging到couchdb
我有一个非常大的数据集 ,我想保存在couchdb的可search性。
我希望logging看起来像这样:
{ "type": "first", "name": "ryan", "count": 447980 }
由于文本文件大于我应该保留在内存中,我正在设置一个stream式readline读取器,如下所示:
var db = require('./db'), readline = require('readline'), path = require('path'), fs = require('fs'); // simple callback after cradle save function saveHandler(er, doc){ if (er) return console.log('Error: ', er); console.log(doc); } // save record of type, based on line with count & name function handleCountedLine(type, line){ return function(line){ var record = {type:type}; var i = line.trim().split(' '); record.name = i[1].trim(); record.count = Number(i[0]); db.save(record, saveHandler); } } var handleFirst = handleCountedLine('first'); readline.createInterface({ input: fs.createReadStream('data/facebook-firstnames-withcount.txt'), terminal: false }) .on('line', handleFirst);
数据库是摇篮数据库。
大约有40条左右的logging后,它会慢慢爬行,然后最终耗尽内存。 我试了一下poolr和node-rate-limiter ,用“一次只运行这么多”和“只允许这么多运行一分钟”的策略。 两者都工作得好一些,但仍然用完了内存。 有没有一个很好的方法来实现这个目标,或者我坚持写在python ?
在Google Hangout中,来自Paulo Machado的很棒的帮助,我用一行一行的方式做了一个答案,一个使用stream.pause()&stream.resume()的简单包装,一次只能处理一行代码。 我想给他一点信用,但是他没有来这里回答,所以我就把这个放在这里。 到目前为止,它已经parsing了34039条logging。 如果崩溃,我会更新答案。
var LineByLineReader = require('line-by-line'), path = require('path'), db = require('./db') // line-by-line read file, turn into a couch record function processFile(type){ var fname = path.join('data', types[type] + '.txt'); var lr = new LineByLineReader(fname, {skipEmptyLines: true}); lr.on('error', function (err) { console.log('Error:'); console.log(err); }); lr.on('record', function (record) { console.log('Saved:'); console.log(record); }); lr.on('line', function (line) { lr.pause(); var record = { type: type }; if (type == 'full'){ record.name = line.trim().split(' '); }else{ var i = line.trim().split(' '); record.name = i[1].trim(); record.count = Number(i[0]); } db.save(record, function(er, res){ if (er) lr.emit('error', er, record); if (res) lr.emit('record', record); lr.resume(); }) }); } var types = { 'first':'facebook-firstnames-withcount', 'last':'facebook-lastnames-withcount', 'full':'facebook-names-unique' }; for (type in types){ processFile(type); } // views for looking things up db.save('_design/views', require('./views'));
我猜couchdb是这里的瓶颈。 看看couchdb的批量文档API允许你插入文件集体。 (你可能不应该试图立即提交所有的数据,而是在数组中堆积一堆文档,并将其推送到数据库 – 使用stream.pause()和stream.resume()来限制文本stream)。 如果您使用批量API,您将获得couchdb的效率收益 。
- 从NodeJS获取来自Cloudant / CouchDB数据库的最新文档
- 我应该如何构build我的数据库和API服务器为基于回合的多人iPhone的棋盘游戏? (考虑nodejs,mongo,沙发等)
- Node.js / CouchDB:使用.json文件而不是数据库+版本控制
- 如何在摇篮式通话中创build多个附件
- 如何在couchdb中获得单个请求的所有修订文件?
- 有没有什么办法可以像没有mongodb的_idstring一样创buildmongodb?
- 您将如何在NoSql数据库中对customer> order> ordertem> product进行build模?
- 获取CouchDB数据库中最近更改的所有文档
- couchapp不工作! (node.couchapp.js)