2015-04-06 32 views
2

下面是代碼的NodeJS爲例:爲什麼readdirSync方法在使用大量文件讀取目錄時會佔用大量內存?

var fs = require('fs'); 

function toMb (byteVal) { 
    return (byteVal/1048576).toFixed(2); 
} 

console.log('Memory usage before "readdirSync" apply: ', toMb(process.memoryUsage()['heapUsed']) + ' MB'); 

fs.readdirSync('./parseLogFiles/reports'); 

console.log('Memory usage after "readdirSync" apply: ', toMb(process.memoryUsage()['heapUsed']) + ' MB'); 

目錄 「報告」 包含300.000文件。

我已經得到了以下結果:

Memory usage before "readdirSync" apply: 2.01 MB 
Memory usage after "readdirSync" apply: 22.38 MB 

爲什麼內存使用增加了超過10倍(2.01 VS 22.38)?

對於「readdir」我有同樣的結果。

又如:

var fs = require('fs'); 

function toMb (byteVal) { 
    return (byteVal/1048576).toFixed(2); 
} 

console.log('Memory usage before "readdirSync" apply: ', toMb(process.memoryUsage()['heapUsed']) + ' MB'); 

var filesList = fs.readdirSync('./parseLogFiles/reports'); 

console.log('Memory usage after "readdirSync" apply: ', toMb(process.memoryUsage()['heapUsed']) + ' MB'); 
console.log('Files list size: ', toMb(Buffer.byteLength(filesList.join(''))) + ' MB'); 

我已經得到了以下結果:

Memory usage before "readdirSync" apply: 2.01 MB 
Memory usage after "readdirSync" apply: 22.38 MB 
Files list size: 11.13 MB 

從哪裏9,24Mb來(22.38 - 11.13 - 2.01)的?

+0

嘗試公開垃圾回收器('node --expose_gc')並在'fs.readdirSync()'之後調用'global.gc()'來查看是否有所作爲。 – robertklep 2015-04-06 13:35:19

+0

@robertklep。感謝您的回覆。是的,global.gc()清除了內存。 – Carl 2015-04-07 10:26:49

回答

1

這是因爲READDIR的執行方式...

它在該目錄中的所有文件300K加載到內存給你的列表中。 300k文件名實際佔用大量空間=)

它在C scandir方法的基礎上實現,該方法執行動態內存分配,並基於項目數增量增加內存使用量......以便讀取項目在目錄中,它將不斷調整(增加)保存項目列表所需的內存。

相關問題