2015-05-31 3 views
0

Я пытаюсь отсканировать большое количество изображений, и у меня проблемы. Моя папка с образцом имеет около 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); 

ответ

0

В вашем async.queue, просто наведите курсор обратного вызова в вашей stream.on('end' функции, после console.log

И добавить stream.on('error', callback); для обработки ошибок :)

+0

OMG. Так просто. Так очевидно. Спасибо. – NicholasJohn16