处理大型 JSON 文件:流式处理、分块和内存优化

jsonperformancestreaminglarge-files

处理大型 JSON 文件(100MB+)需要特殊技术。标准的 JSON.parse() 会将整个文件加载到内存中,可能导致应用崩溃。

大型 JSON 文件的问题

对 500MB 文件调用 JSON.parse() 时,至少需要 500MB 可用内存——由于对象开销,实际通常更多。这会导致内存溢出错误和性能下降。

方案 1:流式解析器

流式解析器逐个 token 处理 JSON,无需加载完整文件:

// 使用 stream-json 库

const {chain} = require('stream-chain');

const {parser} = require('stream-json');

const {streamArray} = require('stream-json/streamers/StreamArray');

const pipeline = chain([

fs.createReadStream('large-file.json'),

parser(),

streamArray(),

data => {

// 一次处理一个项目

console.log(data.value);

}

]);

方案 2:分块处理

将大文件分割成较小的块:

const fs = require('fs');

const readline = require('readline');

// 如果 JSON 是行分隔的(NDJSON)

const rl = readline.createInterface({

input: fs.createReadStream('data.ndjson')

});

rl.on('line', (line) => {

const obj = JSON.parse(line);

// 一次处理一个对象

});

方案 3:Node.js 流

使用 Node.js 流进行内存高效处理:

const {Transform} = require('stream');

const jsonTransform = new Transform({

objectMode: true,

transform(chunk, encoding, callback) {

// 转换每个块

callback(null, processChunk(chunk));

}

});

NDJSON 格式

换行分隔的 JSON (NDJSON) 非常适合大型数据集。每行是一个独立的 JSON 对象:

{"id":1,"name":"Alice"}

{"id":2,"name":"Bob"}

{"id":3,"name":"Charlie"}

浏览器端技巧

在浏览器中处理大型 JSON:

  • 使用 Web Workers — 在主线程外解析
  • 懒加载 — 按需加载数据
  • 虚拟化 — 只渲染可见项目
  • 压缩 — 在服务器端使用 gzip
  • 处理前,使用我们的 JSON 压缩器 减小文件大小,使用 JSON 验证器 检查错误。

    相关工具