如何防止JavaScript一次打开太多的文件?

我目前正在通过编写一个简单的音乐数据库程序来学习javascript和nodeJS。 这个想法非常简单,它recursion地扫描一个目录,parsing任何mp3文件,并从这个信息中创build一个数据库。 我写了我的第一个版本,看起来像这样:

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

由于元数据插件的asynchronous特性,这个脚本会recursion地扫描所有的目录,并试图立即打开太多的文件,导致它崩溃。

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

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