nodejs json.stringify 1gb对象耗尽内存

时间:2013-07-21 02:38:36

标签: json node.js

我正在尝试json.stringify一个1 GB的对象,以便我可以将它写入磁盘。我得到FATAL ERROR: JS Allocation failed - process out of memory

如何成功进行字符串化?

2 个答案:

答案 0 :(得分:4)

您可以手动逐位字符串化:如果yx的密钥,那么JSON.stringify(y) + ":" + JSON.stringify(x[y])会为您提供一个细分。

例如,使用fs.appendFileSync,您可以使用:

var output = "out.json";
fs.writeFileSync(output, "{");
var first = true;
for(var y in x) {
    if(x.hasOwnProperty(y)) {
        if(first) first = false;
        else fs.appendFileSync(output, ",");
        fs.appendFileSync(output, JSON.stringify(y) + ":" + JSON.stringify(x[y]))
    }
} 
fs.appendFileSync(output, "}");

您还可以使用Write Stream

答案 1 :(得分:0)

使用Object,Array checker进行扩展

var first, y, i$, ref$, len$, toString$ = {}.toString;
switch (toString$.call(x).slice(8, -1)) {
case 'Object':
  fs.writeFileSync(output, '{');
  first = true;
  for (y in x) {
    if (x.hasOwnProperty(y)) {
      if (first) {
        first = false;
      } else {
        fs.appendFileSync(output, ',');
      }
      fs.appendFileSync(output, JSON.stringify(y) + ':' + JSON.stringify(x[y]));
    }
  }
  fs.appendFileSync(output, '}');
  break;
case 'Array':
  fs.writeFileSync(output, '[');
  first = true;
  for (i$ = 0, len$ = (ref$ = x).length; i$ < len$; ++i$) {
    y = ref$[i$];
    if (first) {
      first = false;
    } else {
      fs.appendFileSync(output, ',');
    }
    fs.appendFileSync(output, JSON.stringify(y));
  }
  fs.appendFileSync(output, ']');
  break;
default:
  fs.writeFileSync(output, JSON.stringify(x));
}