In a 最近的问题 https://stackoverflow.com/questions/36492268/nodejs-running-out-of-memory-processing-csv-files,我概述了在处理大量 csv 文件(每个文件中有数百万条记录)时遇到的 OOM 情况。
我对这个问题研究得越多,对 Node.js 的了解越多,我就越确信 OOM 的发生不是因为内存泄漏,而是因为我没有限制系统中的数据输入。
该代码只是盲目地吸收所有数据,为每一行创建一个回调事件。事件不断添加到主事件循环中,最终变得如此之大,以至于耗尽了所有可用内存。
Node 处理这种情况的惯用模式是什么?我是否应该将 csv 文件的读取绑定到某种阻塞队列,一旦满了,就会阻止文件读取器解析更多数据?有没有处理大型数据集的好例子?
Update:换句话来说,更简单地说,Node 处理输入的速度比处理输出的速度快,并且 slack 被存储在内存中(作为事件队列的事件排队)。因为有很多松弛,内存最终会耗尽。所以问题是:将输入降低到输出速率的惯用方法是什么?
最好的选择是将事物设置为流,并依靠内置的背压语义来完成此操作。这流手册 https://github.com/substack/stream-handbook作为一个非常好的概述。
与 unix 类似,节点流模块的主要组合运算符称为 .pipe(),并且您可以免费获得背压机制来限制慢速消费者的写入。
Update
我没用过readline
之前除了终端输入之外的任何模块,但阅读文档看起来它接受输入流和输出流。如果将数据库编写器构建为可写流,则应该能够让readline
在内部为您进行管道传输。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)