node.js中写入流上的多次写入

时间:2011-04-18 07:31:17

标签: file-io node.js eventemitter

我一直在查看node-dirty的代码,并注意到当将大量数据写入文件时,原始程序员已选择将写入数据集合到多个组中,并一次发出一组写入,但它们都是作为一个循环的一部分同时发布的,无需等待任何回调。我有三个问题。我有类似的问题要解决。

  1. 这在某种程度上更有效吗?我也应该捆绑写吗?
  2. 我应该如何选择最佳的捆绑尺寸?为什么不写一个小组?
  3. 如果我在写入流上注册了on('drain')事件,那么在所有同时发出的写入完成后,它是否只会发出一次?或者每次之后? (我的猜测是前者)
  4. 如果发出on('error'),是否也会发出('drain')事件?或者它们是互相排斥的吗?
  5. 谢谢

2 个答案:

答案 0 :(得分:2)

  

这在某种程度上更有效吗?   我也应该捆绑写作吗?

进行许多小写操作效率低下。发送写命令会附加开销。因此,只写5个字节而不是1000个更昂贵。

  

我应该如何选择最佳捆绑   尺寸?为什么不写一个小组?

对我来说,最佳尺寸听起来像黑色艺术。我认为有充分的理由不做一个大写。可能要早一点开始写。稍早开始一点效率稍高。

  

如果我注册了on('drain')事件   在写入流上,它是否会被发出   毕竟只有一次同时   发出的写入已经完成?或之后   每? (我的猜测是前者)

当写入队列中的所有内容都已完成写入时,会触发触发器。因此,只要您更快地附加到写入队列然后写入它,它应该只触发一次。你需要一个系统的地狱来拉动这样的边缘情况。

  

如果发出on('error'),将会   ('drain')事件也会发出?   或者他们是互相排斥的?

即使它被发射,在'drain'中进行错误处理也没有意义。如果发生错误,我将始终假设整个写入操作失败,并且不尝试恢复中间写入。

答案 1 :(得分:0)

  

For 4.如果发出on('error'),是否也会发出('drain')事件?或者他们是互相排斥的?

您担心它,因为您不想在应用程序中维护状态。所以,也许你可以使用便利功能:

function not_if(proc, veto_inner) {
  var vetoed = false;
  return {
    proc: function() {
      if (!vetoed) { return proc.apply(null, arguments); }
    }, 
    vetoer: function() {
      if (!vetoed) {
        vetoed = true;
        veto_inner.apply(null, arguments);
    }
  };
}

现在,您可以将'error'处理程序设置为notoer,将'drain'处理程序设置为'proc',而不是在调用'error'后调用'drain'进行调用。