在node.js中写入stream上多次写入

我一直在研究node-dirty的代码,并注意到当向一个文件写入大量数据时,原始程序员select将写入分成几个组,并一次一个地写入组,都是作为一个循环的一部分同时发布的,而不用等待任何callback。 我有三个关于这个问题。 我有一个类似的问题要解决。

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

谢谢

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

做很多小写操作是低效的。 发送一个写命令有附加开销。 所以只写5个字节而不是1000个是比较昂贵的。

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

对我来说,最佳尺寸听起来像是一种黑色艺术。 我认为不要把它写成一个大写字母是有好处的。 可能会在稍后再开始写作。 稍早开始稍微有效一些。

如果我注册到写入stream上的on('drain')事件,那么在所有同时发出的写入完成之后它只会被发射一次吗? 或之后? (我的猜测是前者)

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

如果发出on('error'),那么('drain')事件是否也会被发射? 还是相互排斥?

即使排放出来,在“排放”中进行error handling也是没有意义的。 如果发生错误,我总是会认为整个写入操作失败,不会尝试恢复中间写入。

对于4.如果发出on('error'),那么('drain')事件是否也会被发射? 还是相互排斥?

你很担心,因为你不想在你的应用程序中保持状态。 所以,也许你可以使用一个便利的function:

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'被调用之后调用'drain'处理程序来处理'proc'而不是'drain'。