【问题标题】:Create big json object js创建大json对象js
【发布时间】:2020-12-22 04:40:33
【问题描述】:

我正在使用 Nodejs 从一个非常大的 JSON 对象 (1GB) 创建一个 JSON 文件。为了避免内存问题,我使用 createWriteStream :

var writeStream = fs.createWriteStream('./output/outPut.json')

使用Builder(自定义函数)后会返回一个大对象JSON。

最后一步是创建这个文件:

 writeStream.write(JSON.stringify(search_index), (err) => {
             if (err) throw err
             console.log('File  Ready... ')
                    })

但不幸的是,JSON.stringify 不能与这么重的 Object 一起使用

JSON.stringify 抛出 RangeError: Invalid string length for large objects

请问这个问题有解决办法吗?

【问题讨论】:

  • 创建这么大的文件的目的是什么。你能把信息分成更小的文件吗?
  • @Craicerjack 我正在使用elasticlunr JS在我的应用程序中构建搜索模块,这个文件是搜索索引,不幸的是,它不能分成多个文件
  • 这能回答你的问题吗? Parse large JSON file in Nodejs
  • @RishabhDeepSingh 这个答案是关于如何读取大型 JSON 而不是创建它
  • searchIndex 是数组还是对象?

标签: javascript node.js v8 fs


【解决方案1】:

如果你只写一个大字符串,写流是没有用的。你不能在这里使用原生的JSON.stringify。但是,有quite a few libraries 可以将 JSON 序列化到流中(甚至更多用于从流中反序列化),请使用其中之一。

【讨论】:

    【解决方案2】:

    将大数据集合写入文件(即搜索索引中的大量文档)时,通常最好使用较小的包,以便在内存消耗和计算时间之间找到平衡。

    例如,您可以创建 100 个 JavaScript 对象 (n = 100)、stringify 它们,将它们附加到您的文件中,然后继续创建接下来的 100 个对象。

    这里的诀窍是调整包大小n,以充分利用系统内存,而无需花费太多时间对文件进行读/写操作。

    一个常见的缺陷是您的文档总数可能不是您的包裹大小n 的整数倍。使用从零开始的索引变量进行迭代时,您应该在以下情况下写入文件:

    index % n === 0 || index === (totalCount - 1)

    另一个好处是,您可以在发生错误后启动/重新启动此过程,而无需重新创建所有数据(即,如果在写入 800MB 数据后发生错误,您可以记录最后一个成功的索引并从那里继续)。

    【讨论】:

      【解决方案3】:

      第一步是初始化你的流对象

      const writeStream = fs.createWriteStream('./object.json', { flags: 'w' })
      

      然后将我的数据转换为字符串 JSON (stringify) 使用JSON Stream Stringify module

      const JsonStreamStringify = require('json-stream-stringify')
      const jsonStream = new JsonStreamStringify(Promise.resolve(Promise.resolve(TargetData)))
      

      最后一步是将返回的数据通过管道传送到 writeStream

      jsonStream.pipe(writeStream)
      jsonStream.on('end', () => console.log('done '))
      

      但在我的情况下可能需要很长时间 10-15 分钟 (1.1GB)

      【讨论】:

        猜你喜欢
        • 2018-09-10
        • 2022-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-08
        • 2015-07-22
        • 1970-01-01
        相关资源
        最近更新 更多