我使用jsmediatags来读取大量文件的标签(> 20.000)。我的代码抛出一个EMFILE错误(ERROR fs错误:EMFILE:太多打开文件,打开“path-to-file”)因为我超过了打开文件的最大数量。我不能使用graceful-js之类的东西,因为fs内置于模块中。所以我的问题是:如何避免EMFILE错误?
我可以想到两种方法:使用某些东西一次只读取批量数据或以某种方式用graceful-js替换fs依赖。如果有人能指出我正确的方向,那将是非常有帮助的。
var addToDatabase = (files) => {
for(let i=0;i<files.length;i++){
if(files[i].endsWith(".mp3")){
new jsmediatags.Reader(files[i])
.setTagsToRead(["title", "track", "artist", "album", "year"])
.read({
onSuccess: function(tag) {
database.insert({path: files[i], title: tag.tags.title, track: tag.tags.track, artist: tag.tags.artist, album: tag.tags.album, year: tag.tags.year});
},
onError: function(error) {
console.log("ERROR", error.type, error.info, files[i]);
}
});
}
}
}
require('node-dir').files(_some_dir, function(err, files) {
if (err) dispatch(rebuildDbRejected("ERROR while reading the database directory"));
addToDatabase(files);
});
答案 0 :(得分:0)
我从jsmediatags改变了NodeFileReader,现在它似乎有效。
const fs = require('fs');
//added these lines
var gracefulFs = require('graceful-fs');
gracefulFs.gracefulify(fs);