2

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

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

谢谢

4

2 回答 2

2

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

进行许多小写操作效率低下。发送一个写命令有附加的开销。所以只写 5 个字节而不是 1000 个字节更昂贵。

我应该如何选择最佳的捆绑包大小?为什么不写一组呢?

对我来说,最佳尺寸听起来像是一门黑色艺术。我认为有充分的理由不把它写成一篇大文章。可能是先开始写,然后再写。早一点开始会更有效率。

如果我在 writestream 上注册 on('drain') 事件,它会在所有同时发出的写入完成后仅发出一次吗?还是在每个之后?(我的猜测是前者)

当写入队列中的所有内容都完成写入时触发排水。因此,只要您比写入队列更快地追加到写入队列,它应该只触发一次。你需要一个地狱般的系统来拉出这样的边缘案例。

如果发出 on('error') 事件,是否也会发出 ('drain') 事件?还是它们相互排斥?

即使它被发出,在'drain'中进行错误处理也没有意义。如果发生错误,我总是认为整个写入操作都失败了,而不是尝试在写入过程中恢复。

于 2011-04-21T20:30:32.790 回答
0

对于 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' 处理程序设置为 vetoer,将 'drain' 处理程序设置为 'proc',而不必担心在调用 'error' 后调用 'drain'。

于 2011-04-21T21:08:07.457 回答