Я пытаюсь отсканировать большое количество изображений, и у меня проблемы. Моя папка с образцом имеет около 4 тыс. Маленьких файлов, и я продолжаю работать с ошибками EMFILE
.Сканирование большого количества файлов
Я использую async.queue
, чтобы попытаться ограничить количество обрабатываемых файлов всего 10 штук. Это должно быть хорошо по пределу дескриптора файла, но это не сработает. Несколько тысяч будут проверены правильно, но я начну получать ошибки для других файлов до того, как будут завершены первые.
Мне кажется, что они фактически не находятся в очереди, я вижу много «файлов» и «конец» задолго до вывода данных на консоль, и я не уверен, почему.
Я довольно новичок в 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);
OMG. Так просто. Так очевидно. Спасибо. – NicholasJohn16