【发布时间】:2015-02-08 03:44:31
【问题描述】:
我正在从 mongodb 集合中流式传输数据,对手头的数据进行一些计算,然后将其存储回 mongo。该过程在前 50k 条左右的记录中运行良好,然后就陷入了困境。前 50k 条记录似乎每秒存储 2-3k 条记录,然后接近每秒 2 条记录。
var stream = Schema.find().stream();
stream.on('data', function (doc) {
pauseStream(this);
total++;
OtherSchema.find().exec(function(err,others) {
doc.total = others.data + doc.data;
doc.save(function(err) {
written++;
});
});
});
function pauseStream(stream) {
if((total > (written + 50)) && !timedout) {
timedout = true;
stream.pause();
setTimeout(function() {
timedout = false;
pauseStream(stream);
}, 100);
}
else {
stream.resume();
}
}
我试图将流量控制为一次只有 50 个未完成的更新,我已经上下更改了这个数字,没有改变挂断的位置。我究竟做错了什么?似乎是某种内存泄漏。当我使用 memwatch 时,50k 的统计数据如下所示:
{ num_full_gc: 2368,al: 168610
num_inc_gc: 55680,
heap_compactions: 2368,
usage_trend: 4177.7,
estimated_base: 89033445,
current_base: 121087440,
min: 15957344,
max: 366396904 }
【问题讨论】:
-
我想知道使用 setImmediate 是否有帮助 - 在这里查看答案之一stackoverflow.com/questions/16080650/…
-
这似乎加快了 50k 结果的速度,但结果仍然相同,我想知道是否存在一些关闭/垃圾收集问题。
-
您好,想看看您是否发现了问题? tnx
标签: javascript node.js mongodb memory-leaks mongoose