【问题标题】:downloading million images in nodejs在nodejs中下载百万张图片
【发布时间】:2016-10-16 23:14:27
【问题描述】:

我正在做一个项目,在该项目中创建一些 url,然后从这些 url 获取图像。

例如我有一个数组对象urls

['abc.com/01.jpg',
'abc.com/01.jpg',
.......
]

诸如此类的网址..

我要做的是从这些网址获取图像并尝试通过此代码保存它们

download = (uri, filename, callback) ->
  request.head uri, (err, res, body) ->
    # console.log 'content-type:', res.headers['content-type']
    # console.log 'content-length:', res.headers['content-length']
    request(uri).pipe(fs.createWriteStream(filename)).on 'close', callback
    return
  return

但它不能正常工作。任何人对从 nodeJS 项目中的 url 下载图像有一些好的想法?

或者可能不是在本地保存它们而是在从 url 获取后将它们上传到 Dropbox?

我从上面的代码中得到了这个错误

      throw er; // Unhandled stream error in pipe.
      ^

Error: EMFILE: too many open files, open 'C:\Users\Administrator\Desktop\graby\image.jpg'
  at Error (native)

 [nodemon] app crashed - waiting for file changes before starting...

【问题讨论】:

  • 因为 javascript 是异步的,所以您刚刚要求您的脚本同时下载 100 万张 jpg 文件。理想情况下,您可能希望同时下载 10 个文件。您可能想要测试的确切数字。因为即使可以处理太多也会导致所谓的颠簸,这会减慢速度而不是加快速度。
  • 您建议的最佳方法是什么?
  • 只保留活动连接的计数,。因此,您首先可能会启动 10 个连接,每次连接完成时,启动下一个。
  • 我们不能让系统暂停一段时间吗?当它下载一个图像然后暂停等等?
  • 暂停在这里无济于事。理想情况下,您肯定希望这件事尽可能快地进行。下载 10 个或更多文件,如果您下载的网站具有高延迟不应导致 Node 出现任何问题。

标签: javascript node.js jpeg


【解决方案1】:

您正在尝试并行打开所有这些文件的流(文件),但操作系统限制了您的应用程序的流。

您可以尝试一个接一个地同步下载文件,也可以尝试批量下载,因此总是尝试并行下载 30 张图像。

【讨论】:

  • 如何一个接一个地做,请举一些例子或任何参考
  • @JunaidFarooq Request AFAIK 不提供此类功能,因此您可以创建一个函数来在剩余 URL 时分派下载,并从下载回调中调用此函数。
猜你喜欢
  • 2015-03-15
  • 2012-03-31
  • 1970-01-01
  • 2019-01-31
  • 2021-12-25
  • 2011-02-03
  • 1970-01-01
  • 2013-04-11
  • 2022-01-13
相关资源
最近更新 更多