错误:EMFILE:打开的文件太多
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
模块,它是fs
模块的直接替代品。它是本机fs
模块的包装器。引用graceful-fs
模块的文档,
对
open
和readdir
调用进行排队,如果文件描述符过多出现EMFILE
错误,则在关闭时重试这些调用。
由于它公开与本机fs
模块相同的 API,因此您可以像使用普通fs
模块一样使用它。
// use just like fs
var fs = require('graceful-fs');
注意:这个库是由Isaac Z. Schlueter创建的,他是Node.js的核心开发人员之一。
另一个简单的解决方案是等待文件下载,然后才使用递归打开新请求:
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);
}
}
相关文章:
- 一个html元素的克隆次数太多
- ExtJS类的最佳实践最终导致了太多的.JS文件.性能怎么样
- 使用.slice分页选择了太多项目
- 堆排序实现进行了太多比较
- 如何在不每秒调用太多次的情况下通过Soundcloud解析api进行循环
- 如何修复“;太多递归”;ReactJS中的错误
- 为什么fs.readFile在windows上花费太多时间
- 如何避免webGL着色器加载给cpu带来太多负载
- node.js 需要太多的 TCP 套接字
- JavaScript循环迭代太多
- 需要来自单个JS文件的多个子模块与节点/组件.js
- 节点.js将文件从多个目录复制到一个目录
- 函数崩溃,因为太多迭代jQuery
- 为什么不'当用户输入空格或字符太多/不够时,此函数会发出window.alert
- Angularjs:为什么重复做太多的工作
- 运行“监视”任务 等待中..警告:EMFILE,打开的文件“./.”太多
- 太多的 JavaScript 文件
- 是否可以合并javascript文件以避免太多的http请求
- 节点和错误:EMFILE,打开的文件太多
- 错误:EMFILE:打开的文件太多