【问题标题】:NodeJS Async JSON parsing causing Buffer.toString() failureNodeJS 异步 JSON 解析导致 Buffer.toString() 失败
【发布时间】: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 模块的吗?

标签: json node.js


【解决方案1】:

有没有一种方法可以异步读取我的 JSON 文件,分块不超过 256Mb 的缓冲区长度,而无需手动将我的 JSON 数据传播到多个文件中?

这是一个常见问题,有几个模块可以帮助您解决这个问题:

JSONStream 示例:

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
猜你喜欢
  • 2022-06-22
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 2015-01-07
  • 2016-05-31
  • 2015-10-05
  • 1970-01-01
相关资源
最近更新 更多