2017-06-16 35 views
0

我發現在NodeJS上使用ES6新的Set()會增加字符串輸入的內存消耗,即使重複值時也是如此。請看下面的例子,把1到1e6寫成整數和字符串。NodeJS設置()與字符串產生不合理的大內存

整數版本將保留約60MB的RSS使用量。由於字符串中的相同數字會導致RAM消耗量的增加,因此在腳本結尾使用了幾乎1GB的RAM。有任何想法嗎?

'use strict'; 
 

 
// Integer 
 
let setA = new Set(); 
 
for(let i=0; i<=3e7; i++){ 
 
\t 
 
\t setA.add(i%1e6); 
 
\t 
 
\t if(i%1e6 == 0){ 
 
\t \t console.log("Now: ", i) 
 
\t \t let m = process.memoryUsage(); 
 
\t \t console.log('RSS ' + Math.round(m['rss']/1024/10.24)/100 + 
 
\t \t \t ' MB, heapTotal ' + Math.round(m['heapTotal']/1024/10.24)/100 + 
 
\t \t \t ' MB, heapUsed ' + Math.round(m['heapUsed']/1024/10.24)/100 + 
 
\t \t \t ' MB, external ' + Math.round(m['external']/1024/10.24)/100 + 
 
\t \t \t ' MB\n'); 
 
\t } 
 
} 
 
setA = {}; 
 

 
// String 
 
let setB = new Set(); 
 
for(let i=0; i<=3e7; i++){ 
 
\t 
 
\t setB.add((i%1e6) + ''); 
 
\t 
 
\t if(i%1e6 == 0){ 
 
\t \t console.log("Now: ", i) 
 
\t \t let m = process.memoryUsage(); 
 
\t \t console.log('RSS ' + Math.round(m['rss']/1024/10.24)/100 + 
 
\t \t \t ' MB, heapTotal ' + Math.round(m['heapTotal']/1024/10.24)/100 + 
 
\t \t \t ' MB, heapUsed ' + Math.round(m['heapUsed']/1024/10.24)/100 + 
 
\t \t \t ' MB, external ' + Math.round(m['external']/1024/10.24)/100 + 
 
\t \t \t ' MB\n'); 
 
\t } 
 
}

回答

0

我可以用節點V6轉載本文,但不能與節點V8,所以我想有是得到了這兩個之間解決了一個實現(或者GC?)問題版本。

爲V8最終結果:

Now: 30000000 
RSS 99.11 MB, heapTotal 85.5 MB, heapUsed 79.16 MB, external 0.01 MB 

(雖然最大 RSS是350MB左右,所以區別,我認爲,是因爲垃圾收集)

+0

非常感謝。在我更新到v8.0後,這不會再發生。 – Ming