我需要在一个月内下载大量图片。
我编写了一个脚本,以大约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()
的文件。谢谢!
答案 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)
在您的用例中,您没有文本文件,但适用相同的逻辑