如何将大型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)
答案 0 :(得分:5)
Node后面是实现JS实现的v8引擎。 V8是用c ++编写的,因此它使用类型将字符保存在字符串中(这里谨慎使用讽刺)。
根据ECMA的规定,JavaScript将每个字符存储在两个字节(utf16编码)上。
String类型是零或更多的所有有序序列的集合 16位无符号整数值(“元素”),最大长度为 2 ^ 53-1元素
所以你遇到的不是内存限制,而是一个失败的操作,因为字符串大于字符串类型的字节大小。
如果你试图在javascript中编写json对象而不是从fs中读取它(通过要求它),那么你将有一个内存不足的例外,因为设置了限制以防止这种情况发生。
答案 1 :(得分:2)
出现错误是因为您正在尝试创建一个太大的(单个)字符串。
一些可能的解决方案:
JSON.parse()
,然后继续下一行。但是,如果解析的JavaScript值占用太多空间,您仍可能遇到内存/ GC问题。