限制事件队列中的事件

2024-03-26

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(使用前将#替换为@)

限制事件队列中的事件 的相关文章

随机推荐

  • Pyenv 的 python 缺少 bzip2 模块

    我使用 pyenv 安装 python 3 8 2 并创建一个 virtualenv 在virtualenv中 我使用pipenv来安装pandas 但是 当导入 pandas 时 我得到以下信息 File home luislhl pye
  • roxygen2 importFrom 和二元运算符

    格式化呼叫的方式是什么importFrom使用时roxygen2 我可以看到两种方法 importFrom base in or importFrom base in 显然我们不会将基本函数导入到包中 但这是为了演示 我测试了一下HERE
  • 如何给listview添加跑马灯效果?

    我在 ArrayList 中有我的朋友列表 我正在尝试使用 ArrayAdapter 和 rowlayout xml 在列表视图中显示它
  • Python 3 和二进制文件的 base64 编码

    我是 Python 新手 确实有一个问题困扰着我 我使用以下代码获取 zip 文件的 Base64 字符串表示形式 with open C Users Mario Downloads exportTest1 zip rb as file z
  • 停止 Eclipse/Java 运行多个实例

    我不是 java 专家或 eclipse 专家 目前我正在开发一个项目 我需要经常调试 测试 我使用 eclipse run 按钮 但是当我不关闭程序 eclipse java 时 它会再次打开 第二个窗口 这是一个带有 swing jfr
  • 使用 Windows Installer 取消 Windows 服务安装/卸载会导致服务安装/卸载不完整

    我已经使用 VS 2017 为 Windows 服务创建了一个 Windows Installer Windows 服务内部有一个项目安装程序和服务安装程序类 当我中途取消卸载过程时 该过程会删除 Windows 服务 但不会更新数据 因此
  • 前置声明有哪些危险?

    我刚刚接受采访 有人问我什么是 前瞻性声明 然后有人问我是否存在与前瞻性声明相关的危险 我无法回答第二个问题 在网上搜索并没有出现任何有趣的结果 那么 有人知道使用前向声明有什么危险吗 好吧 除了重复的问题之外 标准中至少有一个痛处 如果你
  • 从 String java 或 javascript 中修剪 和
    标签

    我想使用 java 或 javascript 从字符串中删除开头和结尾的 br 和 nbsp 标签 输入和所需的输出托管在 jsfiddle net 中 因为 Stackoverflow 不允许我发布 html 内容 http jsfidd
  • Java Swing 中的 PNG 渲染不良(颜色深度低)

    我目前正在使用 swing 在 java 中设计吃豆人 我有使用以下语句在屏幕上绘制的 PNG 图像 wall new ImageIcon GamePanel class getResource wall png getImage g2d
  • 如何使用 PowerShell 将“date-1”格式设置为 mm-dd-yyyy?

    一个人如何得到date 1并在 PowerShell 中将其格式化为 mm dd yyyy 示例 如果今天是 2013 年 11 月 1 日 我的代码中需要 10 31 2013 我以前使用过 AddDays 1 但我似乎无法让它与任何格式
  • 启动 PyQt 应用程序而不阻塞主线程

    我正在向现有应用程序添加 PyQT UI 我必须初始化QAppliaction通过我在主线程上从该应用程序收到的回调 我无法从回调中同步执行此操作 因为我最终必须调用app exec 这是阻塞的 阻止现有应用程序继续运行 显然 生成常规线程
  • 将 JSON 数组读入类似 Julia DataFrame 的类型

    给定一个 JSON 文件 JSON 包会愉快地解析它 但如果我想把它作为DataFrame 或任何其他柱状数据结构 获得它的好方法是什么 目前 例如 我有 using JSON using DataFrames json str color
  • 使用 powershell 从多台计算机中提取注册表值

    我和一位同事正在尝试创建一个 powershell 脚本 该脚本使用一个 CSV 文件 其中包含公司网络上所有计算机的名称 并使用这些名称连接到远程注册表并提取特定值 这是我们目前所拥有的 strMachineName import csv
  • MySQL存储过程中用于选择数据的if语句

    我有下面的 SQL 代码 DELIMITER CREATE PROCEDURE test new procedure queryString VARCHAR 255 BEGIN SELECT tempValue COUNT FROM tes
  • 被类覆盖的扩展方法不会给出警告

    我在另一个线程中进行了讨论 发现类方法优先于具有相同名称和参数的扩展方法 这很好 因为扩展方法不会劫持方法 但假设您已向第三方库添加了一些扩展方法 public class ThirdParty public static class Th
  • pdf-writer 无效的多字节字符 (US-ASCII) 期望 keywords_end 内容 = "%PDF-#{@version}\n%âãÏÓ\n" Rails 3

    我在尝试运行的协作项目中遇到了 pdf writer gem 的问题 我正在使用RVM Ruby 1 9 2p180 Rails 3 1 0 on Ubuntu 10 10 我创建了一个新的gemset使用 Bundler 安装所需的 ge
  • 如何模拟 Object.getClass?

    我正在开发一个 Java 项目 想要为 DTO 中的 equals 方法编写单元测试 在 equals 方法中 有一个 getClass 方法由两个被测试对象调用 我想模拟这个 但我不知道它想要什么类型的对象 我试过 when mockRo
  • 带有窗口服务的网络打印

    我有一个朋友用窗口窗体做了同样的事情 我需要的是将其作为窗口服务 Window 服务程序 打印控制器服务 将用作中央打印机控制器 根据情况 我将打印作业发送到网络上的不同打印机 打印机安装在USB上 已经可以进行测试打印 但是当我列出已安装
  • HttpContext.Current.User.Identity.Name 始终为 string.Empty

    您好 我使用自定义 MembershipProvider 我想在应用程序场景中知道当前用户名 但是当我尝试访问 HttpContext Current User Identity Name 时 它 总是返回 string Empty if
  • 限制事件队列中的事件

    In a 最近的问题 https stackoverflow com questions 36492268 nodejs running out of memory processing csv files 我概述了在处理大量 csv 文件