Как я могу настроить будущее, чтобы загрузить больше файлов?

У меня много файлов, которые мне нужно скачать.

я использую 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)
Другие вопросы по тегам