【发布时间】:2014-07-06 06:21:37
【问题描述】:
我有一个very large dataset,我想将它保存在 couchdb 中以供搜索。
我希望记录看起来像这样:
{
"type": "first",
"name": "ryan",
"count": 447980
}
由于文本文件比我应该在内存中保存的要大,我正在设置一个流式 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);
db 是一个摇篮 db。
大约 40 条记录后,它会减慢到完全爬行,然后最终耗尽内存。我尝试了poolr 和node-rate-limiter,使用“一次只运行这么多”和“只允许在一分钟内运行这么多”策略。两者都工作得更好,但它仍然内存不足。有没有实现这个目标的好方法,还是我卡在writing it in python?
【问题讨论】:
-
谷歌环聊中的 Paulo Machado 提到我应该暂停并恢复油门,我不知道我可以这样做。我做了这个,它在停止之前处理了 60 条记录(更好但仍然没有解决):gist.github.com/konsumer/6d4003a6ff49c78c8a59
-
我不会使用 readline。它会让你慢下来。
-
我是在没有 readline 的情况下完成的(使用自定义流),它有点慢。