【问题标题】:throttling events in event queue限制事件队列中的事件
【发布时间】:2016-04-08 16:40:54
【问题描述】:

recent SO question 中,我概述了在处理大量包含数百万条记录的 csv 文件时遇到的 OOM 情况。

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

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

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


更新:换句话说,Node 处理输入的速度比处理输出的速度要快,并且 slack 存储在内存中(作为事件队列的事件排队)。因为有很多松弛,内存最终会耗尽。所以问题是:将输入限制为输出速率的惯用方法是什么?

【问题讨论】:

  • 如果我的回答没有提供足够的细节,分享一些示例代码将帮助我做一个更具体的例子。
  • 代码链接在第一句话中。谢谢。
  • 我的错误,我习惯于在被问到的问题中看到相关代码。我会尽快更新我的答案。

标签: javascript node.js


【解决方案1】:

最好的办法是将事物设置为流,并依靠内置的背压语义来做到这一点。 Streams Handbook 是一个很好的概述。

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

更新

我之前没有将readline 模块用于终端输入以外的任何东西,但阅读文档时,它看起来像是接受输入流和输出流。如果您将 DB 写入器构建为可写流,您应该能够让 readline 在内部为您提供管道。

【讨论】:

  • 啊!事情开始对我来说就位......我确实使用流来读取数据,但我没有使用管道。
  • 最终,我将从 readline 切换到实现流的 node-csv。另一方面,我看到至少有几个库(mongoose-object-streammongoose-write-stream)在 Mongoose 之上实现了可写流。感谢您为我指明了正确的方向。
猜你喜欢
  • 1970-01-01
  • 2014-02-10
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
相关资源
最近更新 更多