从R中的图像URL异步下载图像

时间:2019-07-05 18:41:34

标签: r asynchronous imagedownload

我需要在一个月内下载大量图片。

我编写了一个脚本,以大约200 / sec的速度在个人计算机上下载小型JSON文本;最终,我将在服务器上运行脚本。 (不幸的是,我知道图像下载会慢很多。)如下所示的脚本可以并行进行异步调用,这大约是异步但串行进行异步调用的三倍。

require(crul)
require(tidyverse)
require(tictoc)
require(furrr)

asyncCalls <- function(i) {
    urls_to_call = all_urls[i:min(i + 99, nrow(all_urls))]
    cc <- Async$new(urls = urls_to_call)  # ready the requests
    res <- cc$get()  # make the requests
    lapply(res, function(z) z$parse("utf-8"))  # parse the crul results
}

all_urls <- paste0("http://placehold.it/640x440&text=image", seq(1, 200))

plan(multiprocess)  # use multiple cores
tic()
metadata <- unlist(future_map(seq(0, floor(nrow(all_urls)/100))*100, ~ asyncCalls(.x)))
toc()

正如人们期望的那样,通过asyncCalls()运行这些图像URL会将所有元素返回为NA

如何修改脚本以允许我从这些URL快速下载图像?我在crul中找不到文件下载功能,而且不确定如何异步使用类似download.file()的文件。谢谢!

1 个答案:

答案 0 :(得分:0)

crul的维护者。

Async支持写入磁盘。您需要传递与URL列表长度相同的文件路径列表。例如:

library(crul)
cc <- Async$new(
  urls = c(
    'https://eu.httpbin.org/get?a=5',
    'https://eu.httpbin.org/get?foo=bar',
    'https://eu.httpbin.org/get?b=4',
    'https://eu.httpbin.org/get?stuff=things',
    'https://eu.httpbin.org/get?b=4&g=7&u=9&z=1'
  )
)
files <- replicate(5, tempfile())
res <- cc$get(disk = files)
out <- lapply(files, readLines)

在您的用例中,您没有文本文件,但适用相同的逻辑