NodeJS 异步 JSON 解析导致 Buffer.toString() 失败
Posted
技术标签:
【中文标题】NodeJS 异步 JSON 解析导致 Buffer.toString() 失败【英文标题】:NodeJS Async JSON parsing causing Buffer.toString() failure 【发布时间】:2017-09-15 11:54:24 【问题描述】:我正在尝试在 NodeJS 中解析一个相当大的 JSON 文件(~500Mb)。我的实现基于this answer 中给出的异步方法:
var fileStream = require('fs');
var jsonObj;
fileStream.readFile('./data/exporttest2.json', fileCallback);
function fileCallback (err, data)
return err ? (console.log(err), !1):(jsonObj = JSON.parse(data));
//Process JSON data here
这一切都很好,但我收到以下错误消息:
buffer.js:495
throw new Error('"toString()" failed');
^
Error: "toString()" failed
at Buffer.toString (buffer.js:495:11)
at Object.parse (native)
at fileCallback (C:\Users\1700675\Research\Experiments\NodeJS\rf_EU.js:49:18)
at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:445:3)
我从this answer 了解到,这是由 V8 引擎中的最大缓冲区长度设置为 256Mb 造成的。
那么我的问题是,有没有一种方法可以异步读取我的 JSON 文件,块的缓冲区长度不超过 256Mb,而无需手动将我的 JSON 数据传播到多个文件中?
【问题讨论】:
您能分享一下您是如何使用JSONstream
模块的吗?
【参考方案1】:
有没有一种方法可以异步读取我的 JSON 文件,分块不超过 256Mb 的缓冲区长度,而无需手动将我的 JSON 数据传播到多个文件中?
这是一个常见问题,有几个模块可以帮助您解决这个问题:
https://www.npmjs.com/package/JSONStream https://www.npmjs.com/package/stream-json https://www.npmjs.com/package/json-stream https://www.npmjs.com/package/json-parse-stream https://www.npmjs.com/package/json-streams https://www.npmjs.com/package/jsonparseJSONStream 示例:
const JSONStream = require('JSONStream');
const fs = require('fs');
fs.createReadStrem('./data/exporttest2.json')
.pipe(JSONStream.parse('...'))...
有关所有参数的详细信息,请参阅文档。
【讨论】:
实际上只是偶然发现了其中的几个库。在 NodeJS 社区解决这个问题之前,我会使用一个。尽管如此,还是感谢您的回复。 你知道为什么JSONStream
没有超出缓冲区吗?它会在数据进入时尝试解析它吗?【参考方案2】:
尝试使用streams:
let fs = require("fs");
let s = fs.createReadStream('./a.json');
let data = [];
s.on('data', function (chunk)
data.push(chunk);
).on('end', function ()
let json = Buffer.concat(data).toString();
console.log(JSON.parse(json));
);
【讨论】:
这仍然会导致同样的问题,当Buffer.concat(data).toString()
执行时,缓冲区中有 >256Mb以上是关于NodeJS 异步 JSON 解析导致 Buffer.toString() 失败的主要内容,如果未能解决你的问题,请参考以下文章