2016-05-12 64 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