在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的效率收益 。