首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Node.JS I/O写入日志数据时出现问题

使用Node.JS I/O写入日志数据时出现问题
EN

Stack Overflow用户
提问于 2011-05-16 11:40:33
回答 2查看 761关注 0票数 1

我正在将Node.JS与一个库进行接口,该库提供对数据的迭代器样式访问:

代码语言:javascript
复制
next = log.get_next()

实际上,我想写下以下内容:

代码语言:javascript
复制
while (next = log.get_next()) {
    console.log(next);
}

并将stdout重定向到一个文件(例如node log.js > log.txt)。这对于小日志很有效,但是对于大批量日志,输出文件是空的,并且我的内存使用量会达到顶峰。

看起来我并不完全理解node中的I/O,因为一个简单的无限循环向控制台写入一个字符串也表现出同样的行为。

关于如何完成这项任务的一些建议将是很好的。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-16 22:38:30

WriteStream类缓冲i/o,如果你永远不会放弃线程,那么队列中的写操作就永远不会得到服务。最好的方法是写入一个合理的数据块,然后等待缓冲区清除,然后再次写入。WriteStream类发出一个“排出”事件,该事件告诉您缓冲区何时被完全刷新。下面是一个例子:

代码语言:javascript
复制
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();

如果你像这样运行:

代码语言:javascript
复制
node testbuffer > output

您将看到文件周期性地增长,内存达到稳定状态。

票数 2
EN

Stack Overflow用户

发布于 2011-05-16 13:41:19

您正在与之交互的库应该接受回调。Node.js被设计为非阻塞的。我认为可能是console.log在发送输出之前一直将控制权返回给循环(和log.get_next())。

如果重写该模块以使get_next支持回调,则改进后的代码可能如下所示:

代码语言:javascript
复制
var log_next = function() {
  console.log(next);
  log.get_next(log_next);
};
log.get_next(log_next);

(有一些库和模式可以使代码更美观。)

如果代码只是同步的,并且必须保持原样,则使用0或其他较小的数字调用setTimeout可以防止阻塞整个过程。

代码语言:javascript
复制
var log_next = function() {
  console.log(log.get_next());
  setTimeout(log_next, 0);
};
log_next();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6012968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档