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

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

Я использую функцию download.file() и furrr::map для параллельной загрузки, с plan(strategy = "multicore").

Посоветуйте, пожалуйста, как я могу загрузить больше рабочих мест для каждого будущего?

Работает на Ubuntu 18.04 с 8 ядрами. Версия R 3.5.3.

Файлы могут быть в формате txt, zip или в любом другом формате. Размер варьируется от 5 до 40 МБ.

1 Ответ

2 голосов
/ 25 марта 2019

Использование 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)
...