我正在尝试在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引起的。
我的问题是,是否有一种方法可以在不超过缓冲区长度256Mb的块中异步读取我的JSON文件,而无需手动将我的JSON数据传播到多个文件中? < / p>
答案 0 :(得分:2)
有没有办法可以在不超过缓冲区长度256Mb的块中异步读取我的JSON文件,而无需手动将我的JSON数据传播到多个文件中?
这是一个常见问题,有几个模块可以帮助你:
JSONStream示例:
const JSONStream = require('JSONStream');
const fs = require('fs');
fs.createReadStrem('./data/exporttest2.json')
.pipe(JSONStream.parse('...'))...
有关所有参数的详细信息,请参阅文档。
答案 1 :(得分:-1)
尝试使用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));
});