以下是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对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 :(得分:1)
这是因为readdir的实现方式......
它必须将该目录中的所有300k文件加载到内存中以提供列表。 300k文件名实际占用了大量空间=)
它是在C scandir方法之上实现的,它执行动态内存分配并根据项目数量逐步增加内存使用量...因此,当它读取目录中的项目时,它将不断调整(增加)内存需要保存项目清单。