将巨大的json包含到node.js脚本中的最佳方法是什么?

时间:2016-08-10 21:17:34

标签: javascript json node.js

如何将大型json文件(550MB)包含到node.js脚本中?

我试过了:

var json = require('./huge-data-set.json')

脚本是使用增加的--max-old-space-size参数

执行的
node --max-old-space-size=4096 diff.js

失败了:

buffer.js:500
    throw new Error('"toString()" failed');
    ^

Error: "toString()" failed
    at Buffer.toString (buffer.js:500:11)
    at Object.fs.readFileSync (fs.js:552:33)
    at Object.Module._extensions..json (module.js:556:20)

2 个答案:

答案 0 :(得分:5)

Node后面是实现JS实现的v8引擎。 V8是用c ++编写的,因此它使用类型将字符保存在字符串中(这里谨慎使用讽刺)

根据ECMA的规定,JavaScript将每个字符存储在两个字节(utf16编码)上。

  

String类型是零或更多的所有有序序列的集合   16位无符号整数值(“元素”),最大长度为   2 ^ 53-1元素

所以你遇到的不是内存限制,而是一个失败的操作,因为字符串大于字符串类型的字节大小。

如果你试图在javascript中编写json对象而不是从fs中读取它(通过要求它),那么你将有一个内存不足的例外,因为设置了限制以防止这种情况发生。

答案 1 :(得分:2)

出现错误是因为您正在尝试创建一个太大的(单个)字符串。

一些可能的解决方案:

  • 根据需要使用不同的后备存储(例如sqlite db)和查询数据,而不是一次性将其全部加载到内存中
  • 如果您的数据是顶层的数组,请考虑将每个数组元素放在一个单独的行上,这样您只需缓冲一行和JSON.parse(),然后继续下一行。但是,如果解析的JavaScript值占用太多空间,您仍可能遇到内存/ GC问题。