jeudi 26 février 2015

Why "readFile" method places file's content into the memory in contrast with "readFileSync"?

Here is an example of NodeJS code (synchronous version):



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');


I have got the following results:


Memory usage before files read: 22.45 MB

Memory usage after files read: 23.31 MB

Total files size: 258.19 MB


Here is asynchronous version:



...

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

}

}


I have got the following results:


Memory usage before files read: 22.45 MB

Memory usage after files read: 437.88 MB

Total files size: 258.19 MB


Why does it happen (23.31 MB vs 437.88 MB)?


Aucun commentaire:

Enregistrer un commentaire