Использование furrr работает просто отлично.Я думаю, что вы имеете в виду furrr::future_map
.Использование multicore
значительно увеличивает скорость загрузки ( Примечание : в Windows multicore
недоступно, только multisession
. Используйте multiprocess
, если вы не уверены, на какой платформе будет выполняться ваш код).
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
Создано в 2019-03-25 пакетом prex (v0.2.1)
Имейте в виду, я использую Ubuntu, поэтому использую Windowsскорее всего, все изменится, поскольку, насколько я понимаю, в Windows многоядерность в Windows невозможна.
Я просто догадываюсь здесь, но причина, по которой multisession
медленнее, может заключаться в том, что он должен открыть несколькоR сессий перед запуском функции download.file
.Я просто загружал очень маленький набор данных (iris.csv
), поэтому, возможно, для больших наборов данных, которые занимают больше времени, время, необходимое для открытия сеанса R, будет компенсировано временем, которое требуется для загрузки больших файлов.
Незначительное обновление :
Вы можете передать вектор 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)