【问题标题】:multiple writes on a writestream in node.js在 node.js 中的 writestream 上进行多次写入
【发布时间】:2011-04-18 07:31:16
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 您能否显示一个指向执行此操作的 node-dirty 部分的链接。 link

标签: file-io node.js eventemitter


【解决方案1】:

这在某些方面更有效吗? 我也应该捆绑写作吗?

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

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

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

如果我报名参加 on('drain') 活动 在写流上,它会被发射吗 毕竟同时只有一次 已发出的写入已完成?或之后 每个? (我猜是前者)

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

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

即使发出它,在“drain”中进行错误处理也没有意义。如果发生错误,我将始终假设整个写入操作都失败了,并且不会尝试在写入过程中恢复。

【讨论】:

  • 澄清一下,我不打算处理排水管中的错误。但我有我的成功处理程序在流失。我只是想确保它没有被解雇:)
  • @Vishnu 那么应该没问题。我会仔细检查来源
【解决方案2】:

对于 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'。

【讨论】:

    猜你喜欢
    • 2017-12-20
    • 2014-04-08
    • 2018-07-04
    • 2018-07-02
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多