私は現在、単純な音楽データベースプログラムを作成して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を持つディレクトリでそれを実行し、致命的な欠陥をすぐに認識しました。
メタデータプラグインの非同期性により、このスクリプトはすべてのディレクトリを再帰的にすばやくスキャンし、あまりにも多くのファイルを一度に開いてクラッシュさせようとします。
特定の時間に開いているファイルの数を制限するにはどうすればよいですか?私はジェネレータの使用について考えていましたが、私はまだ彼らの働き方を頭の中に入れようとしています。