我正在尝试扫描大量图像,但我遇到了一些麻烦。我的示例文件夹有大约4k个小文件,我一直遇到EMFILE
错误。
我正在使用async.queue
尝试将处理的文件数限制为一次只有10个。这应该在文件描述符限制之下,但它不起作用。几千个将被正确扫描,但我会在第一个文件完成之前开始获取其他文件的错误。
在我看来,他们似乎并没有真正排队,在数据输出到控制台之前很久就看到了很多“文件完成”和“结束”,我不知道为什么。< / p>
我对Node.js很陌生,所以如果有人有更好的想法如何处理和做到这一点,我真的很感激。谢谢你的帮助。
var fs = require('fs');
var crypt = require('crypto');
var path = '../pictures/';
var async = require('async');
function end(err) {
console.log(err);
}
function fileDone(err) {
if(err) {
console.log(err);
} else {
console.log('file done');
}
}
function scanDirectory(path, queue, callback, recursive) {
fs.readdir(path,function(err,files) {
if(err) {
callback(err);
}
files.forEach(function(file) {
fs.stat(path + file, function(err,stats) {
if(err) {
console.log(err);
}
if(recursive && stats && stats.isDirectory()) {
var newPath = path + file + '/';
scanDirectory(newPath, queue, callback, recursive);
} else if (!stats.isDirectory()) {
queue.push(path + file, fileDone);
}
});
});
});
}
var q = async.queue(function(file, callback) {
var hash = crypt.createHash('md5');
var stream = fs.createReadStream(file);
stream.on('data',function(data) {
hash.update(data,'utf8');
});
stream.on('end',function() {
var md5 = hash.digest('hex');
console.log(file);
console.log(md5);
});
callback();
},10);
q.empty = function() {
console.log('the end');
}
scanDirectory(path, q, end, false);
答案 0 :(得分:0)
在async.queue
中,只需在stream.on('end'
console.log
功能中的回调即可
添加stream.on('error', callback);
来处理错误:)