2
我目前通過編寫簡單的音樂數據庫程序來學習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的目錄中,很快就意識到了這個致命的缺陷。
由於元數據插件的異步特性,此腳本將遞歸掃描所有目錄,並且嘗試立即打開太多文件,導致其崩潰。
限制在給定時間打開的文件數量的最佳方法是什麼?我正在考慮使用發生器,但我仍然試圖圍繞他們如何工作。