在node.js中写入stream上多次写入
我一直在研究node-dirty的代码,并注意到当向一个文件写入大量数据时,原始程序员select将写入分成几个组,并一次一个地写入组,都是作为一个循环的一部分同时发布的,而不用等待任何callback。 我有三个关于这个问题。 我有一个类似的问题要解决。
- 这在某种程度上更有效率吗? 我应该捆绑写作吗?
- 我应该如何select最佳的包装尺寸? 为什么不写一个组?
- 如果我注册到写入stream上的on('drain')事件,那么在所有同时发出的写入完成之后它只会被发射一次吗? 或之后? (我的猜测是前者)
- 如果发出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'。