扫描大量文件

Scanning a large number of files

我正在尝试扫描大量图像,但遇到了一些问题。我的示例文件夹有大约 4k 个小文件,我将 运行 保留为 EMFILE 个错误。

我正在使用 async.queue 来尝试将正在处理的文件数量限制为一次仅 10 个。这应该远低于文件描述符限制,但它不起作用。几千个将被正确扫描,但我会在第一个文件完成之前开始收到其他文件的错误。

在我看来,他们实际上并没有排队,我看到很多 "file done" 和 "the end" 早在数据输出到控制台之前我就没有知道为什么。

我是 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);

在您的 async.queue 中,只需将您的回调移动到 stream.on('end' 函数中,在 console.log

之后

并添加一个stream.on('error', callback);来处理错误:)