Как я могу настроить будущее, чтобы загрузить больше файлов?
У меня много файлов, которые мне нужно скачать.
я использую download.file()
функция и furrr::map
загружать параллельно, с plan(strategy = "multicore")
,
Посоветуйте, пожалуйста, как я могу загрузить больше рабочих мест для каждого будущего?
Работает на Ubuntu 18.04 с 8 ядрами. Версия R 3.5.3.
Файлы могут быть в формате txt, zip или в любом другом формате. Размер варьируется от 5 до 40 МБ каждый.
1 ответ
Использование 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 пакетом представлением (v0.2.1)
Имейте в виду, я использую Ubuntu, поэтому использование 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)