事件队列中的限制事件

时间:2016-04-08 16:40:54

标签: javascript node.js

bv_rewriter::reduce_app_core中,我概述了我在处理大量csv文件时遇到的OOM情况,每个文件中包含数百万条记录。

我正在研究这个问题越多,我在Node.js上阅读的越多,我就越相信因为内存泄漏而没有发生OOM,而是因为我没有限制数据输入进入系统。

代码只是盲目地吸收所有数据,为每一行创建一个回调事件。事件继续被添加到主事件循环中,最终变得如此之大以至于耗尽了所有可用内存。

Node处理这种情况的惯用模式是什么?我是否应该将csv文件的读取绑定到某种阻塞队列,一旦填满,将阻止文件阅读器解析更多数据?有没有关于处理大型数据集的好例子?

更新:为了使这一点变得更加简单和简单,Node可以比处理输出更快地处理输入,并且松弛存储在内存中(排队为事件队列的事件)。因为有很多松弛,内存最终会耗尽。所以问题是:将输入限制在输出速率的惯用方法是什么?

1 个答案:

答案 0 :(得分:1)

最好的办法是将内容设置为流,并依靠内置的背压语义来实现。 Streams Handbook作为一个非常好的概述。

  

与unix类似,节点流模块的主要组合运算符称为.pipe(),您可以获得一个背压机制,可以免费为慢速消费者节省写入。

<强>更新

我以前没有将readline模块用于除终端输入之外的任何其他模块,但是阅读文档看起来它接受输入流和输出流。如果您将数据库编写器构建为可写流,则应该能够让readline在内部为您管道。