为什么readdirSync方法在读取大量文件的目录时会占用大量内存?

这里是一个NodeJS代码的例子:

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)?

这是因为readdir的实现方式…

它必须将该目录中的所有300k文件加载到内存中以提供列表。 300k的文件名实际上占用了很多空间=)

它是在C scandir方法的基础上实现的,它根据项目的数量进行dynamic内存分配和递增内存使用…所以它读取目录中的项目,它将不断地调整(增加)需要的内存项目列表。