Node.JS 中的 createReadStream

2024-03-09

所以我使用了 fs.readFile() 它给了我

“致命错误:CALL_AND_RETRY_LAST 分配失败 - 进程超出 记忆”

由于 fs.readFile() 在调用回调之前将整个文件加载到内存中,我应该使用 fs.createReadStream() 代替吗?

这就是我之前对 readFile 所做的事情:

fs.readFile('myfile.json', function (err1, data) {
    if (err1) {
        console.error(err1);
    } else {
        var myData = JSON.parse(data);
        //Do some operation on myData here
    }
}

抱歉,我对流媒体还不太熟悉;以下是做同样事情但使用流媒体的正确方法吗?

var readStream = fs.createReadStream('myfile.json');

readStream.on('end', function () {  
    readStream.close();
    var myData = JSON.parse(readStream);
    //Do some operation on myData here
});

Thanks


如果文件很大,那么是的,流式处理将是您想要的处理方式。但是,您在第二个示例中所做的是将所有文件数据缓冲到内存中,然后在end。它本质上与readFile那样。

您会想查看一下JSON流 https://github.com/dominictarr/JSONStream。流式处理意味着您要在数据流过时对其进行处理。在你的情况下,你显然have这样做是因为您无法一次将整个文件缓冲到内存中。考虑到这一点,希望这样的代码有意义:

JSONStream.parse('rows.*.doc')

请注意,它有一种查询模式。这是因为您不会同时使用文件中的整个 JSON 对象/数组,因此您必须更多地考虑希望 JSONStream 如何处理数据当它发现它时.

您可以使用 JSONStream 来查询您感兴趣的 JSON 数据。这样您就永远不会将整个文件缓冲到内存中。它确实有一个缺点,如果您确实需要所有数据,那么您必须多次流式传输文件,使用 JSONStream 只提取当时需要的数据,但在您的情况下,您没有很多选择。

您还可以使用 JSONStream 按顺序解析数据并执行诸如将其转储到数据库之类的操作。

JSONStream.parse类似于JSON.parse但它不是返回整个对象,而是返回一个流。当解析流获得足够的数据来形成与您的查询匹配的整个对象时,它将发出data事件,数据是与您的查询匹配的文档。配置数据处理程序后,您可以将读取流通过管道传输到解析流中,并观察神奇的发生。

Example:

var JSONStream = require('JSONStream');
var readStream = fs.createReadStream('myfile.json');
var parseStream = JSONStream.parse('rows.*.doc');
parseStream.on('data', function (doc) {
  db.insert(doc); // pseudo-code for inserting doc into a pretend database.
});
readStream.pipe(parseStream);

这是帮助您了解正在发生的情况的详细方式。这是一个更简洁的方法:

var JSONStream = require('JSONStream');
fs.createReadStream('myfile.json')
  .pipe(JSONStream.parse('rows.*.doc'))
  .on('data', function (doc) {
    db.insert(doc);
  });

Edit:

为了进一步清楚发生了什么,尝试这样思考。假设您有一个巨大的湖泊,您想要对水进行处理以净化它并将水转移到新的水库。如果你有一架带有巨大水桶的巨型魔法直升机,那么你可以飞越湖泊,将湖放入水桶中,向其中添加处理化学品,然后将其飞向目的地。

当然,问题是没有这样的直升机可以处理那么大的重量或体积。这根本不可能,但这并不意味着我们不能以不同的方式实现我们的目标。因此,您在湖泊和新水库之间建造了一系列河流(溪流)。然后,您在这些河流中设立净化站,净化流经河流的水。这些站可以以多种方式运行。也许处理速度可以如此之快,以至于您可以让河流自由流动,当水以最大速度顺流而下时,净化就会发生。

也有可能水需要一些时间才能得到处理,或者该站需要一定量的水才能有效处理水。因此,您将河流设计为有闸门,并控制水从湖泊流入河流的流量,让水站缓冲所需的水,直到它们完成工作并将净化后的水释放到下游并进入最终的水。目的地。

这几乎正​​是您想要对数据执行的操作。解析流是您的清理站,它会缓冲数据,直到它有足够的数据来形成与您的查询相匹配的整个文档,然后它将该数据推送到下游(并发出data event).

节点流很好,因为大多数时候您不必处理打开和关闭门的问题。节点流足够智能,可以在流缓冲一定量的数据时控制回流。就好像净化站和湖上的闸门正在相互交谈以计算出完美的流速。

如果您有流数据库驱动程序,那么理论上您可以创建某种插入流,然后执行parseStream.pipe(insertStream)而不是处理data手动事件:D。以下是在另一个文件中创建 JSON 文件的筛选版本的示例。

fs.createReadStream('myfile.json')
  .pipe(JSONStream.parse('rows.*.doc'))
  .pipe(JSONStream.stringify())
  .pipe(fs.createWriteStream('filtered-myfile.json'));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.JS 中的 createReadStream 的相关文章

  • 通过 HTML 将复杂变量传递给 javascript 的正确方法

    我试图摆脱使用 PHP 的 htmlentities 但我在这里停止了 但后来我想 我不做替换和检查特殊字符 而是只 JSON 整个对象 这提供了一个非常不受欢迎的结果 其中包含大量双引号 那么我应该怎么做呢 我应该为每个图像分配一个数字唯
  • Node.js:在检索 http 请求正文之前断开 http 请求连接

    我正在用 Node js 编写一个 http 服务器 我有一个客户端通过 HTTP POST 多部分 数据 将大文件上传到该服务器 我想接受唯一使用有效文件名上传文件的连接 我有一些条件 在服务器检索数据之前应断开无效文件名连接 我不知道如
  • .map() Javascript ES6 地图?

    你会怎么做 本能地 我想做 var myMap new Map thing1 1 thing2 2 thing3 3 wishful ignorant thinking var newMap myMap map key value gt v
  • NodeJS Express 中每个请求的全局范围

    我有一个基本的快速服务器 需要在每个请求处理期间存储一些全局变量 更深入地说 请求处理涉及许多需要存储在变量中的操作 例如global transaction 当然 如果我使用global范围 每个连接都将共享其事务的信息 并且我需要一个全
  • jqGrid如何将额外的类应用于标题列

    我想在特定列上应用一个额外的类 我知道通过在 colModel 中指定这一点对于行是可能的 但这些类仅应用于 结果行 中的列 而不应用于标题 我想要达到的是通过简单的类名隐藏较小视口的特定列 与 Twitter Bootstrap 一起使用
  • NodeJS 中的密码重置

    我已经设置使用 NodeJS Passport 更新用户的密码 我遵循了这个很棒的指南 http sahatyalkabov com how to implement password reset in nodejs http sahaty
  • 大型 AngularJS 应用程序设计

    我需要关于设计具有多个复杂模块的 AngularJS 应用程序的建议 并根据用户角色在身份验证和授权后加载模块 有些用户可以访问一个简单的模块 有些用户可以访问仪表板 有些用户可以访问 2 个以上的模块 我们已经确定了许多可以在不同模块中重
  • 为什么名称为“下划线”或“lodash”?

    为什么这些库以 命名 其背后是否有某种意义或者原因是 只是因为我们可以 据我所知 下划线 and lodash做很多类似的事情 此外 这两个名字都指向 甚至它们的变量名也是 那么是否存在某种关系 这些库的工作 或者它只是一个名字 Lodas
  • 从右到左的语言和编程问题

    我正在创建一个网络文本编辑器 它使用我创建的新语言 如 BBcode 这种标记语言将采用阿拉伯语 但我面临这些问题 在所有 IDE 和编辑器中将英语和阿拉伯语文本混合在同一行中确实很困难 因为会发生奇怪的事情 单词和字符的顺序发生变化 使用
  • Google 将用于 Google 可视化的文件保存在哪里?我可以将其设置为我网站的本地文件吗?另外,有没有让仪表在 IE 中工作的代码示例?

    EDIT请在此处查看生成的 html 和 Javascript http jsfiddle net GregMcNulty K6Vrb 1 http jsfiddle net GregMcNulty K6Vrb 1 根据这个评论4 http
  • TypeError:React 中的循环对象值

    这是我的代码 sendMail e e preventDefault fetch https uczsieapp mailer herokuapp com var name document getElementById name var
  • 在JAVA中将数据写入.txt文件?

    我想知道是否是在JAVA中将计算的数据写入文本文件 我的 JAVA 代码是一个基于 GUI 的 gpa 计算器 我只想添加一个 JButton 和 ActionListener 它将类名 GPA 点和计算出的 GPA 写入 txt 文件 这
  • Karma 测试报告运行速度快,但实际上运行速度慢

    最好的解释是a video https youtu be Zwwi01JuPrQ 或参见下面的 gif 您会注意到 Karma 进度报告器报告测试只需要几毫秒 但显然需要相当长的时间 我在推特上提到了这一点 https twitter co
  • JS 中的 .Jar 文件

    有谁知道如何在 JS 中访问 jar 文件 我已经用 Java 创建了类并作为 jar 文件导入 我想从 JS 文件访问该类 大家好 我感谢你们所有人 我尝试在 Firefox XUL 中使用 JS 列出文件夹中的文件 但我做不到 然后我决
  • 将纬度/经度转换为 X/Y,以便在美国地图图像上进行阿尔伯斯投影

    我正在尝试使用 C 或 Javascript 将纬度 经度转换为 X Y 坐标 以将带有 CSS 的 div 左 上 定位到美国地图的背景图像上 美国的标准地图投影是阿尔伯斯投影 如下所示 但 StackOverflow 仅提供参考基本墨卡
  • JavaScript TypedArray 混合类型

    我正在尝试使用 WebGL 并希望将一些不同类型混合到一个字节缓冲区中 我知道 TypedArrays 可以达到这个目的 但不清楚我是否可以与它们混合类型 OpenGL 顶点数据通常是与无符号字节或整数混合的浮点数 在我的测试中 我想将 2
  • Angular 计算 HTML 中的百分比

    我试图在 HTML 中显示百分比值 如下所示 td myvalue totalvalue 100 td 它可以工作 但有时它会给出一个很长的小数 这看起来很奇怪 如何四舍五入到小数点后两位 有更好的方法吗 您可以使用过滤器 如下所示杰夫约翰
  • 使用 mongoose 更新 mongoDb 中数组内的对象[重复]

    这个问题在这里已经有答案了 我正在 MongoDB 上工作 以更新 MongoDB 集合中数组内部的对象值 我的收藏就像 id ObjectId 59b7e839200a5c00ee2d2851 player New playesList
  • 如何让JS变量在页面刷新后保留值? [复制]

    这个问题在这里已经有答案了 是否可以永久更改 JavaScript 变量 例如 如果我设置变量 X 并使其等于 1 然后按钮的 onClick 将该变量更改为 2 如何使该变量在刷新页面时保持为 2 这是可能的window localSto
  • 根据对象内的值将对象数组分成两部分

    我一直在尝试 并努力 弄清楚如何根据键值对拆分对象数组 长话短说 我有一个火车正在停靠的车站列表 需要将之前的停靠点和未来的停靠点分开 我正在使用的数据如下所示 station code SOC station name Southend

随机推荐

  • 没有默认构造函数的类对象的值初始化

    我试图通过以下方式了解值初始化的确切行为T or T 对于类类型T在 C 11 中 让我困惑的是这两个片段取自http en cppreference com http en cppreference com 值初始化 http en cp
  • Swift 逆向工程:Swift 函数名称规则?

    我有一个关于 swift 函数名称规则的问题 当我尝试在 IDA Pro 中分析用 swift 编写的 iOS 应用程序 也许 OS X 也是同样的情况 例如 swift 2048 时 我得到了这样的函数名称 EXPORT TFC10swi
  • Openssl 1.1.0 中的 c2i_ASN1_INTEGER 函数

    我最近在linux系统中将openssl从1 0 2n更新到1 1 0g 早些时候我正在使用 ASN1 INTEGER c2i ASN1 INTEGER ASN1 INTEGER a const unsigned char pp long
  • DataFrame 对象没有属性“名称”

    我目前有一个 Pandas DataFrame 列表 我试图对每个列表元素 即列表中包含的每个 DataFrame 执行操作 然后将该 DataFrame 保存到 CSV 文件 我分配了一个name属性到每个 DataFrame 但我意识到
  • Haskell:Yesod 和状态

    我正在阅读代码玩具 URL 缩短器 http flygdynamikern blogspot com au 2011 06 toy url shortener with yesod and acid html 然而 有一些重要的部分我就是无
  • 纱线安装命令时出现 ESOCKETTIMEDOUT 错误

    我在使用纱线时遇到了麻烦 但仅限于一台计算机 当我跑步时yarn install有些软件包无法下载 并且出现此错误 ESOCKETTIMEDOUT 起初我只是认为存储库存在一些问题 但是 我可以通过网络浏览器下载该包 我在另一台电脑上没有任
  • 如何将 STDOUT 重定向到 NSTextView?

    有人可以告诉我如何将标准输出重定向到 NSTextView 吗 NSLog打印的信息是否属于std Thanks 下面的代码使用dup2将 stdout 插入到写入端NSPipe目的 读取端通过 GCD 调度源进行观察 该源从管道读取数据并
  • sql连接.open()异常

    我是 net 的新手 我正在开发 Windows 窗体应用程序 我正在尝试将我的应用程序连接到基于 Visual Studio 服务的数据库 我只是在提交按钮后面编写代码 private void button1 Click object
  • 如何将小部件(例如 QPushButton)动态添加到设计器内置的布局中

    我正在玩Qt 主要是想为symbian重写一个旧的java应用程序 但我自己有点困惑 我首先要说明的是 C 不是我的功夫 这可能就是问题的根源 我想做的是将一个简单的 QPushButton 添加到主窗口中的垂直布局 该窗口已在运行时在 q
  • Ruby:“意外的keyword_end”...但所有的开头和结尾都匹配

    我正在编写一段代码 它将向用户返回第 n 个素数 我在第 19 行和第 22 行收到 unexpected keywords end 语法错误 我在代码中添加了注释 以便您可以轻松找到错误的位置 def nthPrime n number
  • 如何将所有子域请求重定向到 htaccess 中的主域?

    我需要重定向所有子域请求以重定向到我的 htaccess 中的主域 我需要它还包括某种通配符重定向 例如Washington mysite com 重定向至 mysite com washington 但我还需要将子域上的任何旧网址重定向到
  • Play Framework 2.5 模块的依赖项注入

    我有一个具有以下签名的模块类 class SilhouetteModule extends AbstractModule with ScalaModule 我想注入配置 class SilhouetteModule Inject confi
  • 空白导致 div 在纯 CSS 中堆叠[重复]

    这个问题在这里已经有答案了 我正在使用纯 CSS 来布局网站 但遇到了问题 如果嵌套网格元素之间存在任何空格 则会破坏布局并将最后一个 div 推到下一行 我创建了一个测试网站 内容尽可能少 以测试是否只有我一个人这样做 但我仍然遇到了问题
  • 类签名中的“()V”是什么意思?

    我用 Javassist 创建了一个构造函数 它没有真正的方法 CtConstructor c CtNewConstructor make argTypes null newClass 当我试图发出这个班级的签名时 c getSignatu
  • 了解包含多个Content-Type标头的curl POST请求命令

    以下卷曲命令 curl v F json method update video params video id 582984001 itemState INACTIVE token jCoXH5OAMYQtXm1sg62KAF3ysG90
  • 检测登录页面中的表单身份验证超时

    当您将表单身份验证设置为在访问受保护页面时重定向到 login aspx 时 有什么好方法可以在 login aspx 中检测用户是否因为尚未登录而被发送到那里 或者因为他们的表单身份验证票证已存在已到期 我想显示 您已超时 消息 在这个问
  • 表单未提交到数据库[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 因此 当我在表单上输入信息后 它会使用新表单刷新 new php 页面 但不会提交任何信息 我没有收到任何错误 就像我在页面上单击
  • Python 中频谱图的 FFT

    我将如何使用 Python 从 WAV PCM 文件读取频率峰值 然后能够生成它的图像以进行频谱图分析 我正在尝试制作一个程序 允许您读取任何音频文件 将其转换为 WAV PCM 然后找到峰值和截止频率 Python 波库 http doc
  • Eclipse 注释/取消注释快捷方式?

    我认为这很容易实现 但到目前为止我还没有找到评论 取消评论快捷方式的解决方案Java class editor and jsf faceted webapp XHTML file editor to quickly comment unco
  • Node.JS 中的 createReadStream

    所以我使用了 fs readFile 它给了我 致命错误 CALL AND RETRY LAST 分配失败 进程超出 记忆 由于 fs readFile 在调用回调之前将整个文件加载到内存中 我应该使用 fs createReadStrea