簡體   English   中英

Node.js中稀疏數組的內存消耗

[英]Memory consumption of sparse arrays in Node.js

我寫了一個小程序,生成數組,運行時間很長(幾乎永遠;-)):

var results = [];
var i = 1;

while (true) {
  console.log(i++);
  results.push([]);
}

當我創建一個長度為i的稀疏數組而不是空數組時,程序崩潰得非常快:

var results = [];
var i = 1;

while (true) {
  console.log(i);
  results.push(new Array(i++));
}

其實我起床i等於17424,然后我得到一個錯誤信息,告訴我

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory
Abort trap: 6

和Node.js帶我回到控制台。 由於唯一的區別是第二個產生比前一個更大的空數組,這意味着長度為n的空稀疏數組占用長度為1的空數組的空間的n倍。

我是對的(特別是Node.js)嗎?

還有一個問題:如果我跑了

var results = [];
var i = 1;

while (true) {
  console.log(i);
  var temp = [];
  temp[i++] = i;
  results.push(temp);
}

然后我起床到1286175,然后再次崩潰:

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory
Abort trap: 6

為什么這與其他兩個選項的行為不同?

PS:我使用Node.js 0.12.0在OS X上運行它。

聲明具有大小的數組時

Array(1024);

您正在這樣做,它為1024個元素分配空間。 它必須預先分配這個空間,因為這種聲明數組的形式是一種優化說明

“我需要你保留1024個位置,這樣你就不會隨着我將更多元素推到它上而不斷調整陣列大小”。

正如您可能知道的那樣,使用簡單的[]聲明一個數組仍允許您將無限數量的元素推送到其上,但是數組會在后台靜默調整大小(很可能是memcpy() )以允許此行為。

編輯:

您在第二個示例中獲得更高迭代的原因是因為您現在使用的是稀疏數組。 用稀疏數組做

var arr = []
arr[1000000] = 1;

並不意味着您的陣列現在在內存中使用1,000,000個條目。 將其與密集陣列進行對比

var arr = Array(1000000);

其中明確告訴運行時保留一個可以在內存中存儲1000000個條目的數組。

相關的StackOverflow問題: https ://stackoverflow.com/a/1510842/276949

V8,Node中的JS引擎,在看似空的數組中為每個元素使用4個字節。 找到這一點的最佳方法是在Chrome中創建空數組,並使用分析器查看數組已用盡的額外大小。 有關如何執行此操作的詳細信息,請參閱https://developer.chrome.com/devtools/docs/heap-profiling

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM