创建大json对象js



我使用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:大型对象的字符串长度无效

这个问题有解决方案吗?

如果只写一个大字符串,那么写流就没有用了。您不能在此处使用本机JSON.stringify。然而,有相当多的库可以将JSON串行化实现为流(甚至更多的库用于从流中取消串行化(,请使用其中之一。

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

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

这里的技巧是优化包大小的n,它可以很好地利用系统的内存,而不会花太多时间对文件进行读/写操作。

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

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

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

第一步是初始化流obejct

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

然后将我的数据转换为字符串JSON(stringify(使用JSON流Stringify模块

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(

最新更新