2013-04-28 21 views
2

爲什麼這給我致命錯誤:JS分配失敗 - 加工出來的內存的Node.js - 加工出來的內存

arr = [] 

for (var x=0;x<6000;x++){ 
    var ys=[]; 
    arr.push(ys); 
    for (var y=0;y<6000;y++){ 
     var tile = [0,1,2]; 
     ys.push(tile); 
    } 
} 

我看到它,這只是1.08整數,或者432mb,很遠的路遠離1.4GB限制

+0

不完全。列表中的每個元素都包含對下一個元素的附加引用。但它仍然不應該發生(或者它應該?)。你使用的是什麼版本的NodeJS? – freakish 2013-04-28 20:56:58

+0

我的回答對你有幫助嗎?你能選擇一個答案嗎? – Brandon 2013-06-27 15:55:10

回答

5

事情你不計算:

  • 數組的開銷對象
  • 對象引用的大小
  • 別的節目做
  • Node.js的記憶本身

如果我們假設對象引用是64位(不知道大小...),那麼你有3600萬個參* 4字節= 144兆字​​節。

在計算數組開銷之前,您高達576 MB。另外,由於數組的大小可調整,我不確定分配的長度是否完全基於大小,或者運行時是否會分配額外的內存以防萬一。

如果我記得,當Java中的ArrayList被擴展時,它實際上是雙倍的。

我不清楚數組是如何在JavaScript中實現的,但考慮到讀取數組長度是恆定時間,每個數組可能具有預先計算的長度屬性。

既然你有3600萬個陣列,你還有144兆字​​節。

到目前爲止還有720MB的數字。

我希望這些數組不是像像ArrayList那樣的雙重分配。