处理大型 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: