处理大体积JSON数据导入卡顿怎么办_性能优化与分批操作

老丽吖_8666

老丽吖_8666

2026-03-25

1065人浏览

原创

json.parse()无法安全解析几百mb文件,因v8需全量加载字符串并构建ast,易超内存;应改用stream-json流式解析,按需提取字段,避免内存溢出。

json.parse() 直接解析几百mb文件必卡死

浏览器或node.js里用 json.parse() 一次性读入并解析超大json(比如500mb日志、导出数据),进程会卡住甚至崩溃——这不是代码写错了,是内存模型决定的。v8引擎需要把整个字符串先载入内存,再构建完整ast,中间没有暂停点。

  • Node.js中默认堆内存上限约1.4GB,实际能安全处理的纯JSON字符串远小于此(还要留空间给解析过程)
  • 浏览器端更敏感,200MB JSON就可能触发页面无响应(ERR_OUT_OF_MEMORY 或直接白屏)
  • 别试图调高--max-old-space-size硬扛,治标不治本,且线上环境通常不允许

用stream-json做流式解析,边读边处理

真正可行的方案是跳过“全量字符串→全量对象”这一步,用支持流式解析的库逐段提取关键字段。推荐 stream-json,它不构建完整对象树,只按需产出token或路径匹配结果。

  • 安装:npm install stream-json
  • 适合场景:你其实只关心JSON数组里的某几类字段(如users[].name、logs[].timestamp),不需要整个结构
  • 关键配置:streamObject 或 streamArray 可直接绑定到数组项,避免手动遍历path事件
  • 示例片段(提取大数组中每个对象的id和status):
const { streamArray } = require('stream-json/streamers/StreamArray');
const { chain } = require('stream-chain');
const fs = require('fs');
<p>const pipeline = chain([
fs.createReadStream('huge.json'),
streamArray(),
(data) => {
// data.value 是当前数组项,可直接取字段
console.log(data.value.id, data.value.status);
}
]);</p>

分批导入数据库时,别在循环里反复connect / close

很多人把流式解析后的数据分块(如每1000条一组),然后在for循环里对每批都执行db.insert(...),却没意识到连接开销可能比SQL本身还重。

  • MySQL/PostgreSQL客户端默认开启连接池,但若每次手动new Client()再.connect(),等于绕过池子,频繁握手+TLS协商拖慢整体速度
  • 批量写入优先用原生批量语法:INSERT INTO t VALUES (...), (...), (...),而不是1000次单行INSERT
  • SQLite特别注意:BEGIN TRANSACTION必须包住整批,否则每条INSERT都是独立事务,I/O放大1000倍
  • Node.js里用Promise.allSettled()并发提交多批,但并发数别超过数据库连接池大小(通常设为CPU核心数×2)

前端上传大JSON前,先用Blob.slice()分片校验

用户拖一个800MB JSON文件进网页?别等FileReader.readAsText()跑完才报错。前端该在上传前快速判断是否真JSON、有无明显格式错误,避免白等几分钟。

  • 用Blob.slice(0, 1024 * 1024)只读前1MB,调用JSON.parse()验证开头是否合法(如是否以[或{起始)
  • 检查Content-Type是否为application/json只是弱提示,真实校验得看内容
  • 若后端支持分片上传(如TUS协议),前端应按Uint8Array切片,而非转成字符串再切——避免UTF-8多字节字符被截断导致解析失败
  • 别在主线程做任何JSON.parse(),用Worker隔离,否则UI彻底冻结

最易忽略的是错误恢复:流式解析中途出错(如某行字段类型突变),stream-json默认终止整个流。必须监听error事件并手动destroy(),否则残留句柄会泄漏。还有,所有ReadStream记得加on('error', ...),Node.js里未捕获的流错误不会抛异常,只会静默失败。

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
大数据分析工具有哪四个
大数据分析工具有哪四个

大数据分析的四个工具分别是rapidminer、Hpcc、Hadoop和Pentaho bi。大数据分析用于从各种来源生成的原始数据中提取有价值的数据。这些数据帮助我们获得有意义的见解、隐藏的模式、未知的相关性、市场趋势等等,具体取决于行业。大数据分析的主要动机是提供有价值的见解,以便为未来做出更好的决策。php中文网为大家带来了大数据分析的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

4096

5

Java 大数据处理基础(Hadoop 方向)
Java 大数据处理基础(Hadoop 方向)

本专题聚焦 Java 在大数据离线处理场景中的核心应用,系统讲解 Hadoop 生态的基本原理、HDFS 文件系统操作、MapReduce 编程模型、作业优化策略以及常见数据处理流程。通过实际示例(如日志分析、批处理任务),帮助学习者掌握使用 Java 构建高效大数据处理程序的完整方法。

2025.12.08

1209

12

大数据专业学习教程
大数据专业学习教程

本专题整合了大数据专业学习相关教程,阅读专题下面的文章了解更多详细内容。

2026.01.05

223

5

python处理大数据合集
python处理大数据合集

本专题整合了python处理大数据相关教程,阅读专题下面的文章了解更多详细内容。

2026.01.05

426

22

mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

1953

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1199

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

715

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2552

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

4188

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.2万人学习