首页 > 解决方案 > 如何配置未来以下载更多文件?

问题描述

我有很多文件需要下载。

我正在使用download.file()函数和furrr::map并行下载,与plan(strategy = "multicore").

请告知我如何为每个未来加载更多工作?

在 8 核的 Ubuntu 18.04 上运行。R 版本 3.5.3。

文件可以是 txt、zip 或任何其他格式。大小在 5MB 到 40MB 的范围内变化。

标签: rparallel-processingdownloadfurrr

解决方案


使用 furrr 效果很好。我想你的意思是furrr::future_map。使用multicore会大大提高下载速度(注意:在 Windowsmulticore上不可用,仅multisessionmultiprocess不确定您的代码将在哪个平台上运行时使用)。

library(furrr)
#> Loading required package: future

csv_file <- "https://raw.githubusercontent.com/UofTCoders/rcourse/master/data/iris.csv"

download_template <- function(.x) {
    temp_file <- tempfile(pattern = paste0("dl-", .x, "-"), fileext = ".csv")
    download.file(url = csv_file, destfile = temp_file)
}

download_normal <- function() {
    for (i in 1:5) {
        download_template(i)
    }
}

download_future_core <- function() {
    plan(multicore)
    future_map(1:5, download_template)
}

download_future_session <- function() {
    plan(multisession)
    future_map(1:5, download_template)
}

library(microbenchmark)

microbenchmark(
    download_normal(),
    download_future_core(),
    download_future_session(),
    times = 3
)
#> Unit: milliseconds
#>                       expr       min        lq      mean    median
#>          download_normal()  931.2587  935.0187  937.2114  938.7787
#>     download_future_core()  433.0860  435.1674  488.5806  437.2489
#>  download_future_session() 1894.1569 1903.4256 1919.1105 1912.6942
#>         uq       max neval
#>   940.1877  941.5968     3
#>   516.3279  595.4069     3
#>  1931.5873 1950.4803     3

reprex 包(v0.2.1)于 2019 年 3 月 25 日创建

请记住,我使用的是 Ubuntu,所以使用 Windows 可能会改变一些事情,因为据我所知,未来不允许在 Windows 上使用多核。

我只是在这里猜测,但multisession速度较慢的原因可能是因为它必须在运行该download.file函数之前打开几个 R 会话。我只是下载了一个非常小的数据集iris.csv

小更新

您可以将 URL 向量传递给数据集,future_map以便它下载每个文件,具体取决于未来的包处理:

data_urls <- c("https:.../data.csv", "https:.../data2.csv")
library(furrr)
plan(multiprocess)
future_map(data_urls, download.file)
# Or use walk 
# future_walk(data_urls, download.file)

推荐阅读