我正在将Node.JS与一个库进行接口,该库提供对数据的迭代器样式访问:
next = log.get_next()实际上,我想写下以下内容:
while (next = log.get_next()) {
console.log(next);
}并将stdout重定向到一个文件(例如node log.js > log.txt)。这对于小日志很有效,但是对于大批量日志,输出文件是空的,并且我的内存使用量会达到顶峰。
看起来我并不完全理解node中的I/O,因为一个简单的无限循环向控制台写入一个字符串也表现出同样的行为。
关于如何完成这项任务的一些建议将是很好的。谢谢。
发布于 2011-05-16 22:38:30
WriteStream类缓冲i/o,如果你永远不会放弃线程,那么队列中的写操作就永远不会得到服务。最好的方法是写入一个合理的数据块,然后等待缓冲区清除,然后再次写入。WriteStream类发出一个“排出”事件,该事件告诉您缓冲区何时被完全刷新。下面是一个例子:
var os = require('os');
process.stdout.on('drain', function(){
dump();
});
function dump(){
for (var i=0; i<10000; i++)
console.log('xxxx');
console.error(os.freemem());
}
dump();如果你像这样运行:
node testbuffer > output您将看到文件周期性地增长,内存达到稳定状态。
发布于 2011-05-16 13:41:19
您正在与之交互的库应该接受回调。Node.js被设计为非阻塞的。我认为可能是console.log在发送输出之前一直将控制权返回给循环(和log.get_next())。
如果重写该模块以使get_next支持回调,则改进后的代码可能如下所示:
var log_next = function() {
console.log(next);
log.get_next(log_next);
};
log.get_next(log_next);(有一些库和模式可以使代码更美观。)
如果代码只是同步的,并且必须保持原样,则使用0或其他较小的数字调用setTimeout可以防止阻塞整个过程。
var log_next = function() {
console.log(log.get_next());
setTimeout(log_next, 0);
};
log_next();https://stackoverflow.com/questions/6012968
复制相似问题