如何防止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的目录中,很快就意识到了这个致命的缺陷。

由于元数据插件的异步特性,此脚本将递归扫描所有目录,并且尝试立即打开太多文件,导致其崩溃。

限制在给定时间打开的文件数量的最佳方法是什么?我正在考虑使用发生器,但我仍然试图围绕他们如何工作。

使用承诺做到这一点。它确保代码的流动并防止一次将许多文件加载到内存中。一个很好的探索可以找到here