2016-05-12 2 views
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を持つディレクトリでそれを実行し、致命的な欠陥をすぐに認識しました。

メタデータプラグインの非同期性により、このスクリプトはすべてのディレクトリを再帰的にすばやくスキャンし、あまりにも多くのファイルを一度に開いてクラッシュさせようとします。

特定の時間に開いているファイルの数を制限するにはどうすればよいですか?私はジェネレータの使用について考えていましたが、私はまだ彼らの働き方を頭の中に入れようとしています。

答えて

1

これを行うと約束してください。コードの流れを確実にし、多くのファイルを一度メモリに読み込まないようにします。良い探査が見つかりますhere

関連する問題