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

时间:2015-04-06 13:20:33

标签: javascript node.js

以下是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)来自?

1 个答案:

答案 0 :(得分:1)

这是因为readdir的实现方式......

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

它是在C scandir方法之上实现的,它执行动态内存分配并根据项目数量逐步增加内存使用量...因此,当它读取目录中的项目时,它将不断调整(增加)内存需要保存项目清单。