2011-04-18 66 views
2

我一直在查看node-dirty的代码,并注意到当将大量数据写入文件时,原始程序员选择将写入分成几组,一次一个地发布组的写入,但它们都是作为一个循环的一部分同时发布的,而不用等待任何回调。我有三个关于这个问题。我有一个类似的问题需要解决。在node.js中写入流上的多次写入

  1. 这样更有效吗?我应该捆绑写作吗?
  2. 我应该如何选择最佳的包装尺寸?为什么不写一个组?
  3. 如果我注册写入流上的on('drain')事件,它会在所有同时发出的写入完成后才发出一次吗?或之后? (我的猜测是前者)
  4. 如果发出on('error'),那么('drain')事件是否也会被发射?或者它们是互斥的?

感谢

+0

你可以显示一个指向node-dirty部分的链接吗? [链接](https://github.com/felixge/node-dirty/blob/master/lib/dirty/dirty.js) – Raynos 2011-04-21 20:20:36

回答

2

这是在某些方面更有效率? 我应该捆绑写入吗?

做很多小写操作是低效的。发送写入命令的开销已经附加到它上面。所以写入5个字节而不是1000个字节会更昂贵。

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

最佳尺寸听起来像是一种黑色艺术给我。我认为没有把它写成一个大写字母是有很好理由的。可能会在稍后和之后开始写作。稍早开始稍微高效一点。

如果我注册到的(“漏”)上的writestream事件 ,将它发射 只有在所有同时发行 写入完成后一次?或每个 后? (我的猜测是前者)

当写入队列中的所有内容都写完后,Drain触发。所以只要你写入队列的速度更快,然后写入它,它应该只触发一次。你需要一个系统的地狱来拉动这样的边缘情况。

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

即使排放出来,在'drain'中进行错误处理也没有意义。如果发生错误,我总是会认为整个写入操作失败,并且不会尝试恢复中间写入。

+0

为了澄清,我不打算处理流失中的错误。但我有我的成功经理人流失。我只是想确保它不被解雇:) – Vishnu 2011-04-21 20:40:16

+0

@Vishnu那么它应该没问题。尽管如此,我会仔细检查源代码 – Raynos 2011-04-21 20:41:07

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); 
    } 
    }; 
} 

现在,你可以设定“错误”处理程序vetoer和“漏”处理程序“PROC”,而不是wirry关于“漏”后'被称为错误“被调用。