为什么“readFile”使用比读取文件的内容长度更多的内存?

我有一个约300.000的日志文件在其中的path。 当我使用“readFile”方法读取所有这些文件时,我注意到内存消耗(泄漏)。

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

var fs = require('fs'); var path = './parseLogFiles/reports'; var counter = 0; var totalFileSize = 0; var fileName; var fullPath; function toMb (byteVal) { return (byteVal / 1048576).toFixed(2); } var filesList = fs.readdirSync(path); console.log('Memory usage before files read:', toMb(process.memoryUsage()['heapUsed']) + ' MB'); for (var i = 0, len = filesList.length; i < len; i++) { fileName = filesList[i]; if (fileName) { fullPath = path + '/' + fileName; (function(fullPath){ fs.stat(fullPath, function(err, stat){ totalFileSize += stat['size']; fs.readFile(fullPath, {encoding: 'utf8'}, function(){ if (++counter === len) { console.log('Memory usage after files read:', toMb(process.memoryUsage()['heapUsed']) + ' MB'); console.log('Total files size:', toMb(totalFileSize) + ' MB'); } }); }); })(fullPath); } } 

我有以下结果:

 Memory usage before files read: 22.45 MB Memory usage after files read: 437.80 MB Total files size: 258.19 MB 

(437.80 – 22.45)/ 258.19 = 1.6(使用内存大于读取文件的内容长度)

但是,如果我使用“readFileSync”方法,我不注意内存消耗(泄漏)。

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

 var fs = require('fs'); var path = './parseLogFiles/reports'; var counter = 0; var totalFileSize = 0; var fileName; var fullPath; function toMb (byteVal) { return (byteVal / 1048576).toFixed(2); } var filesList = fs.readdirSync(path); console.log('Memory usage before files read:', toMb(process.memoryUsage()['heapUsed']) + ' MB'); for (var i = 0, len = filesList.length; i < len; i++) { fileName = filesList[i]; if (fileName) { fullPath = path + '/' + fileName; totalFileSize += fs.statSync(fullPath)['size']; try { fs.readFileSync(fullPath, {encoding: 'utf8'}); } catch(err){ console.log('err: ', err); } } } console.log('Memory usage after files read:', toMb(process.memoryUsage()['heapUsed']) + ' MB'); console.log('Total files size:', toMb(totalFileSize) + ' MB'); 

我有以下结果:

 Memory usage before files read: 22.45 MB Memory usage after files read: 23.31 MB Total files size: 258.19 MB 

没有内存消耗(泄漏)。

为什么会发生?

为什么“readFile”使用比读取文件的内容长度更多的内存?

根据ECMAscript规范,Javascriptstring以UTF-16或UCS-2内部表示,两者都需要最less的字节来表示文件中的每个“字符”。 当您将其作为Javascriptstring加载到内存中时,大多由ASCII字符组成的文本文件的大小可能会大致加倍。

这与你是否有内存泄漏的证据是正交的。

(我会说你没有泄漏的证据,为了certificate泄漏的存在,你需要静态数据来显示在多个垃圾收集周期中堆的大小向上的趋势,你只是简单的报告一下堆的使用情况,并在加载文件后。)