【问题标题】:NodeJS JSON.stringify of very long array of objects errors "invalid string length"NodeJS JSON.stringify 非常长的对象数组错误“无效的字符串长度”
【发布时间】:2015-11-12 16:40:12
【问题描述】:

我有一个非常长的对象数组,大小约为 100,000 个项目,就在我将其写入文件之前,我将数据传递到 JSON.stringify

我收到此错误:

JSON.stringify(
     ^
RangeError: Invalid string length

我怎样才能成功地对一个非常大的 json 对象进行字符串化?

更新:

自从我最初写这个问题以来,我对处理大量数据变得更加熟悉,并且我更喜欢在这个过程中使用 Apache Spark。在 Spark 中,习惯上不使用大型 JSON 数组,而是使用包含长 JSON 字符串的流或文件,每行一个对象。文件如下所示:

{"name":"kristian", "favoriteSong":"enter sandman"}
{"name":"joshua", "favoriteSong":"penny lane"}
{"name":"susan", "favoriteSong":"all about that bass"}

这很好,因为:

  • 您可以任意处理 TB 大的文件,也可以轻松地进行一些无逻辑的文件拆分并将其变成一千个更小的文件,逻辑是在某个换行符编号 N 处简单地中断文件。李>
  • 这样您就不会遇到由未关闭的 JSON 数组引起的数据文件损坏的潜在可怕问题。
  • 文件中的大型 JSON 数组往往没有换行符,因此在 VIM 或其他编辑器中打开大文件很麻烦,因为它试图将整个内容加载到内存中,而不是带有换行符的文件,它可以轻松地将前 10 行左右加载到屏幕上而不会出现问题。

【问题讨论】:

  • 呃,创建 org obj 的两个独立对象,将每个对象字符串化,然后将结果连接在一起。

标签: json node.js


【解决方案1】:

我发现 JSONStream 是原生 JSON.stringify 的可靠替代品,它适用于大型对象。例如:

var fileSystem = require( "fs" );
var JSONStream = require( "JSONStream" );
var records = [
    { id: 1, name: "Terminator" },
    { id: 2, name: "Predator" },
    { id: 3, name: "True Lies" },
    { id: 4, name: "Running Man" },
    { id: 5, name: "Twins" }
    // .... hundreds of thousands of records ....
];

var transformStream = JSONStream.stringify();
var outputStream = fileSystem.createWriteStream( __dirname + "/data.json" );
transformStream.pipe( outputStream );    
records.forEach( transformStream.write );
transformStream.end();

outputStream.on(
    "finish",
    function handleFinish() {
        console.log("Done");
    }
);

here获取示例代码。

【讨论】:

  • 这对我不起作用。我嵌套了大约 70 MB 数据的对象数组。你能帮我解决这个问题吗?
  • 这很好用,但请注意,当您忙于填充 transformStream 时,node.js 似乎没有向磁盘写入任何内容。因此,要么以高内存限制启动进程,要么偶尔暂停以给 nodejs 事件循环一些时间来清空管道。
【解决方案2】:

我怎样才能成功地对一个非常大的 json 对象进行字符串化?

部分?例如,将数组分成更小的部分,在更小的部分上使用 JSON.stringify,并将每个段附加到文件中(你必须做一些 [,] 处理)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 2017-09-21
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    相关资源
    最近更新 更多