扫描大量文件
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);
来处理错误:)
我正在尝试扫描大量图像,但遇到了一些问题。我的示例文件夹有大约 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);
来处理错误:)