2013-07-21 24 views
2

我想json.stringify一個1 GB的對象,以便我可以將它寫入磁盤。我得到FATAL ERROR: JS Allocation failed - process out of memorynodejs json.stringify一個1GB的對象用盡內存

我能做些什麼來成功地進行串聯?

+2

您擴展可能會考慮呃https://github.com/dominictarr/JSONStream –

+0

@Dan D.我會接受這個答案。 – Harry

回答

3

您可以手動逐位串聯:如果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

0

與對象,數組檢查

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)); 
 
}