如何防止javascript一次打开太多文件?
问题描述:
我目前通过编写简单的音乐数据库程序来学习javascript和nodeJS。这个想法很简单,它递归地扫描一个目录,解析任何mp3文件,并从这个信息制作一个数据库。我写了我的第一个版本,它看起来像这样:如何防止javascript一次打开太多文件?
var fs = require('graceful-fs');
var metadata = require('musicmetadata');
function recursiveScan(directory){
var files = fs.readdirSync(directory);
// loop through files
for (var i=0; i < files.length; i++) {
var filePath = directory + files[i];
var stat = fs.statSync(filePath);
// Check if it's a directory
if(stat.isDirectory()){
// Scan that directory
recursiveScan(filePath + '/');
}else{
// Find the file extension
var extension = getFileExtension(files[i]);
// If it's an mp3 file, parse it and add it the db
if (extension == 'mp3') {
var parser = metadata(fs.createReadStream(filePath), function (err, songInfo) {
// ... insert song into database
});
}
}
}
}
我运行它在一个目录中有几十个mp3,它工作正常。然后我把它放在一个有几千首mp3的目录中,很快就意识到了这个致命的缺陷。
由于元数据插件的异步特性,此脚本将递归扫描所有目录,并且尝试立即打开太多文件,导致其崩溃。
限制在给定时间打开的文件数量的最佳方法是什么?我正在考虑使用发生器,但我仍然试图围绕他们如何工作。