iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >怎么在Node.js中流式处理大JSON文件
  • 954
分享到

怎么在Node.js中流式处理大JSON文件

2024-04-02 19:04:59 954人浏览 安东尼
摘要

这篇文章主要讲解了“怎么在node.js中流式处理大JSON文件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么在node.js中流式处理大JSON文件”

这篇文章主要讲解了“怎么在node.js中流式处理大JSON文件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么在node.js中流式处理大JSON文件”吧!

场景描述

问题一:假设现在有一个场景,有一个大的 JSON  文件,需要读取每一条数据经过处理之后输出到一个文件或生成报表数据,怎么能够流式的每次读取一条记录?

[   {"id": 1},   {"id": 2},   ... ]

问题二:同样一个大的 JSON 文件,我只读取其中的某一块数据,想只取 list 这个对象数组怎么办?

{  "list": [],   "otherList": [] }

在 Node.js 中我们可以基于以下几种方式读取数据,也是通常首先能够想到的:

  • fs.readFile():这个是一次性读取数据到内存,数据量大了都占用到内存也不是好办法,很容易造成内存溢出。

  • fs.createReadStream():创建一个可读流,能解决避免大量数据占用内存的问题,这是一个系统提供的基础 api  读取到的是一个个的数据块,因为我们的 JSON 对象是结构化的,也不能直接解决上面提的两个问题。

  • 还有一个 require() 也可以加载 JSON 文件,但是稍微熟悉点 Node.js CommonJS 规范的应该知道 require  加载之后是会缓存的,会一直占用在服务的内存里。

了解下什么是 SAX

SAX 是 Simple API for XML 的简称,目前没有一个标准的 SAX 参考标准,最早是在 Java  编程语言里被实现和流行开的,以 Java 对 SAX  的实现后来也被认为是一种规范。其它语言的实现也是遵循着该规则,尽管每门语言实现都有区别,但是这里有一个重要的概念 “事件驱动” 是相同的。

实现了 SAX 的解析器拥有事件驱动那样的 API,像 Stream 的方式来工作,边读取边解析,用户可以定义回调函数获取数据,无论 XML  内容多大,内存占用始终都会很小。

这对我们本节有什么帮助?我们读取解析一个大 JSON 文件的时候,也不能把所有数据都加载到内存里,我们也需要一个类似 SAX  这样的工具帮助我们实现。

基于 SAX 的流式 JSON 解析器

这是一个流式 JSON 解析器 https://GitHub1s.com/creationix/jsonparse  周下载量在 600 多万,但是这个源码看起来很难梳理。如果是学习,推荐一个基于 SAX 的更简单版本

Https://GISt.github.com/creationix/1821394 感兴趣的可以看看。

JSON 是有自己的标准的,有规定的数据类型、格式。这个 JSON  解析器也是在解析到特定的格式或类型后触发相应的事件,我们在使用时也要注册相应的回调函数。

下面示例,创建一个可读流对象,在流的 data 事件里注册 SaxParser 实例对象的 parse 方法,也就是将读取到的原始数据(默认是  Buffer 类型)传递到 parse() 函数做解析,当解析到数据之后触发相应事件。

对应的 Node.js 代码如下:

const SaxParser = require('./jsonparse').SaxParser; const p = new SaxParser({   onNull: function () { console.log("onNull") },   onBoolean: function (value) { console.log("onBoolean", value) },   onNumber: function (value) { console.log("onNumber", value) },   onString: function (value) { console.log("onString", value) },   onStartObject: function () { console.log("onStartObject") },   onColon: function () { console.log("onColon") },   onComma: function () { console.log("onComma") },   onEndObject: function () { console.log("onEndObject") },   onStartArray: function () { console.log("onEndObject") },   onEndArray: function () { console.log("onEndArray") } });  const stream = require('fs').createReadStream("./example.json"); const pparse = p.parse.bind(p); stream.on('data', parse);

怎么去解析一个 JSON 文件的数据已经解决了,但是如果直接这样使用还是需要在做一些处理工作的。

JSONStream 处理大文件

这里推荐一个 NPM 模块 JSONStream,在它的实现中就是依赖的 jsonparse  这个模块来解析原始的数据,在这基础之上做了一些处理,根据一些匹配模式返回用户想要的数据,简单易用。

下面我们用 JSONStream 解决上面提到的两个问题。

问题一:

假设现在有一个场景,有一个大的 JSON  文件,需要读取每一条数据经过处理之后输出到一个文件或生成报表数据,怎么能够流式的每次读取一条记录?

因为测试,所以我将 highWaterMark 这个值调整了下,现在我们的数据是下面这样的。

[   { "id": 1 },   { "id": 2 } ]

重点是 JSONStream 的 parse 方法,我们传入了一个 '.',这个 data 事件也是该模块自己处理过的,每次会为我们返回一个对象:

  • 第一次返回 { id: 1 }

  • 第二次返回 { id: 2 }

const fs = require('fs'); const JSONStream = require('JSONStream');  (async () => {   const readable = fs.createReadStream('./list.json', {     encoding: 'utf8',     highWaterMark: 10   })   const parser = JSONStream.parse('.');   readable.pipe(parser);   parser.on('data', console.log); })()
问题二:

同样一个大的 JSON 文件,我只读取其中的某一块数据,想只取 list 这个数组对象怎么办?

解决第二个问题,现在我们的 JSON 文件是下面这样的。

{   "list": [     { "name": "1" },     { "name": "2" }   ],   "other": [     { "key": "val" }   ] }

与第一个解决方案不同的是改变了 parse('list.*') 方法,现在只会返回 list 数组,other 是不会返回的,其实在 list  读取完成之后这个工作就结束了。

  • 第一次返回 { name: '1' }

  • 第二次返回 { name: '2' }

(async () => {   const readable = fs.createReadStream('./list.json', {     encoding: 'utf8',     highWaterMark: 10   })   const parser = JSONStream.parse('list.*');   readable.pipe(parser);   parser.on('data', console.log); })();
总结

当我们遇到类似的大文件需要处理时,尽可能避免将所有的数据存放于内存操作,应用服务的内存都是有限制的,这也不是最好的处理方式。

文中主要介绍如何流式处理类似的大文件,更重要的是掌握编程中的一些思想,例如 SAX 一个核心点就是实现了 “事件驱动” 的设计模式,同时结合 Stream  做到边读取边解析。

处理问题的方式是多样的,还可以在生成 JSON 文件时做拆分,将一个大文件拆分为不同的小文件。

学会寻找答案,NPM 生态发展的还是不错的,基本上你能遇到的问题大多已有一些解决方案了,例如本次问题,不知道如何使用 Stream 来读取一个 JSON  文件时,可以在 NPM 上搜索关键词尝试着找下。

怎么在Node.js中流式处理大JSON文件

感谢各位的阅读,以上就是“怎么在Node.js中流式处理大JSON文件”的内容了,经过本文的学习后,相信大家对怎么在Node.js中流式处理大JSON文件这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 怎么在Node.js中流式处理大JSON文件

本文链接: https://www.lsjlt.com/news/67162.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在Node.js中流式处理大JSON文件
    这篇文章主要讲解了“怎么在Node.js中流式处理大JSON文件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么在Node.js中流式处理大JSON文件”...
    99+
    2024-04-02
  • 怎么在Python中利用流式读取大文件
    怎么在Python中利用流式读取大文件?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。python可以做什么Python是一种编程语言,内置了许多有效的工具,Python几乎...
    99+
    2023-06-14
  • python如何处理大型json文件
    这篇文章主要为大家展示了“python如何处理大型json文件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python如何处理大型json文件”这篇文章吧。如图所示,要处理的数据是一个json...
    99+
    2023-06-29
  • 如何在Node.js中处理文件路径
    Node.js作为一种服务器端脚本语言,支持开发各种网络应用程序。在开发过程中,文件处理是重要的一部分。在Node.js中,读写文件和操作文件路径是非常常见的操作。本文将讨论如何在Node.js中处理文件路径。文件路径是指文件在计算机存储设...
    99+
    2023-05-14
  • 怎么在python中转换json文件格式
    本篇文章给大家分享的是有关怎么在python中转换json文件格式,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python有哪些常用库python常用的库:1.requesu...
    99+
    2023-06-14
  • Java中怎么处理大文本文件
    今天就跟大家聊聊有关Java中怎么处理大文本文件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。集算器与Java应用程序的集成结构如下:下面举例说明集算器协助JAVA查询大文本的基本过...
    99+
    2023-06-17
  • tomcat返回大文件流占资源怎么处理
    当Tomcat返回大文件流时,可能会占用大量资源,包括内存和网络带宽。为了处理这个问题,可以采取以下几种方法: 增加Tomcat...
    99+
    2024-02-29
    tomcat
  • Node.js 事件循环中事件的处理流程
    ...
    99+
    2024-04-02
  • 关于python处理大型json文件的方法
    如图所示,要处理的数据是一个json数组,而且非常大 下图为电脑配置,使用 json.load() 方法加载上述json文件电脑直接卡死 解决思路:     先用python进行...
    99+
    2024-04-02
  • 怎么在JavaScript中处理JSON数据
    这篇文章主要介绍“怎么在JavaScript中处理JSON数据”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么在JavaScript中处理JSON数据”文章能帮助大家解决问题。一、什么是JSONJ...
    99+
    2023-07-06
  • git文件过大怎么处理
    在使用 Git 进行文件版本控制时,有时候会遇到文件过大的情况。当文件过大,可能会导致 Git 执行速度变慢、内存占用增加甚至 Git 提交上传失败等问题。本文将介绍几种处理 Git 文件过大的方法。一、使用 Git LFS Git Lar...
    99+
    2023-10-22
  • Flume中怎么处理大数据流
    在Flume中处理大数据流的方法主要有以下几种: 使用多个source和sink:可以通过配置多个source和sink来处理大数...
    99+
    2024-04-02
  • golang怎么处理JSON格式
    Golang是一个越来越流行的编程语言,它以其高效、简单和可靠性而受到广泛的欢迎。在Golang中,有一个称为JSON(JavaScript对象表示)的数据格式,它经常被用于Web应用程序中进行数据的传输和交换。在本文中,我们将探讨如何使用...
    99+
    2023-05-14
  • 怎么爬取在XHR中的json文件
    要爬取XHR中的JSON文件,可以使用Python中的requests库来发送HTTP请求并获取响应内容。下面是一个示例代码,可以帮...
    99+
    2023-09-12
    json
  • java 文件流的处理方式 文件打包成zip
    目录java 文件流的处理 文件打包成zip1、下载文件到本地2、java后端下载3、文件打包成zip后台多文件打包成zip返回流 前台提供按钮一键下载java 文件流的处理 文件打...
    99+
    2024-04-02
  • java读取大文件文本怎么处理
    处理大文件文本可以使用Java中的流式处理,以避免一次性将整个文件加载到内存中。以下是一个示例代码,使用BufferedReader...
    99+
    2023-09-20
    java
  • Nodejs处理Json文件并将处理后的数据写入新文件中
    目录处理Json文件并将处理后的数据写入新文件问题描述实现过程用Nodejs解析json数据处理Json文件并将处理后的数据写入新文件 问题描述 事情是这样的,朋友让我处理一个jso...
    99+
    2022-11-13
    Nodejs处理Json文件 Json数据写入新文件 Nodejs写入json文件
  • Node.js+express怎么实现上传大文件
    这篇“Node.js+express怎么实现上传大文件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Node.js+expr...
    99+
    2023-06-17
  • spark怎么处理大量日志文件
    Spark可以使用以下方法来处理大量日志文件: 使用Spark的文件输入源:Spark可以从HDFS、S3等分布式存储系统中读取...
    99+
    2024-04-02
  • Node.js中怎么转换文件编码的格式
    今天就跟大家聊聊有关Node.js中怎么转换文件编码的格式,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。项目很多 lua 文件不是 utf-8格式,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作