Error: EMFILE: too many open files
Error: EMFILE: too many open files
使用 nw.js,我只是想将图像保存在具有不同随机名称的 img 元素数组中。
但是有一些错误,我的代码有问题吗?
for (i = 0; i < imgs.length; i++) {
request(imgs[i].getAttribute('src')).on('error', function(err) {
throw err
}).pipe(fs.createWriteStream('data/imgs/' + randomString))
}
imgs[] 是一个包含 100-500 个 html img 元素的数组,但我收到的是
Error: EMFILE: too many open files, open *<directory>*
还有一个错误:
"Uncaught Error: socket hang up"
虽然它保存了一些图像,但其中一些图像已损坏,并且创建的图像比实际数量多。
使用graceful-fs
module, which is a drop-in replacement for the fs
module. It is a wrapper around the native fs
module. Quoting the docs of graceful-fs
module,
Queues up open
and readdir
calls, and retries them once something closes if there is an EMFILE
error from too many file descriptors.
由于它公开了与本机 fs
模块相同的 API,因此您可以像使用普通 fs
模块一样使用它。
// use just like fs
var fs = require('graceful-fs');
注意: 此库由 Node.js.
的核心开发人员之一 Isaac Z. Schlueter 创建。
另一个简单的解决方案是等待文件下载,然后才使用递归打开新请求:
var fs = require('fs');
var request = require('request');
var dest = '../data/downloads/';
function _saveAllFiles (fileUrlArray, curIdx, options) {
try {
var count = fileUrlArray.length - 1;
var curFile = fileUrlArray[curIdx];
var stream = request(curFile)
.pipe(fs.createWriteStream(dest + "file_" + curIdx));
stream.on('finish', function () {
console.log("Downloaded", curFile);
stream.close();
if (curIdx + 1 < count) {
//Finished, download next file
_saveAllFiles(fileArray, curIdx + 1, options);
}
});
stream.on('error', function () {
console.log("Error", curFile);
stream.close();
stream.end();
if (curIdx + 1 < count) {
//Error occured, go to next file
_saveAllFiles(fileArray, curIdx + 1, options);
}
});
} catch (err) {
console.error("Failed to download file", err);
}
}
使用 nw.js,我只是想将图像保存在具有不同随机名称的 img 元素数组中。
但是有一些错误,我的代码有问题吗?
for (i = 0; i < imgs.length; i++) {
request(imgs[i].getAttribute('src')).on('error', function(err) {
throw err
}).pipe(fs.createWriteStream('data/imgs/' + randomString))
}
imgs[] 是一个包含 100-500 个 html img 元素的数组,但我收到的是
Error: EMFILE: too many open files, open *<directory>*
还有一个错误:
"Uncaught Error: socket hang up"
虽然它保存了一些图像,但其中一些图像已损坏,并且创建的图像比实际数量多。
使用graceful-fs
module, which is a drop-in replacement for the fs
module. It is a wrapper around the native fs
module. Quoting the docs of graceful-fs
module,
Queues up
open
andreaddir
calls, and retries them once something closes if there is anEMFILE
error from too many file descriptors.
由于它公开了与本机 fs
模块相同的 API,因此您可以像使用普通 fs
模块一样使用它。
// use just like fs
var fs = require('graceful-fs');
注意: 此库由 Node.js.
的核心开发人员之一 Isaac Z. Schlueter 创建。另一个简单的解决方案是等待文件下载,然后才使用递归打开新请求:
var fs = require('fs');
var request = require('request');
var dest = '../data/downloads/';
function _saveAllFiles (fileUrlArray, curIdx, options) {
try {
var count = fileUrlArray.length - 1;
var curFile = fileUrlArray[curIdx];
var stream = request(curFile)
.pipe(fs.createWriteStream(dest + "file_" + curIdx));
stream.on('finish', function () {
console.log("Downloaded", curFile);
stream.close();
if (curIdx + 1 < count) {
//Finished, download next file
_saveAllFiles(fileArray, curIdx + 1, options);
}
});
stream.on('error', function () {
console.log("Error", curFile);
stream.close();
stream.end();
if (curIdx + 1 < count) {
//Error occured, go to next file
_saveAllFiles(fileArray, curIdx + 1, options);
}
});
} catch (err) {
console.error("Failed to download file", err);
}
}