Является ли функция типа `purrr :: map ()` внутри `future.apply :: future_apply ()` также запущенной параллельно? - PullRequest
0 голосов
/ 16 февраля 2019

Извините, если это глупые вопросы, но я почти ничего не знаю о том, как параллельная обработка работает на практике.

Мои вопросы:
- Q1.Функция, подобная purrr::map() в future.apply::future_apply(), также выполняется параллельно?
- Q2.Что произойдет, если я запускаю furrr::future_map() внутри функции future.apply()?
- Q3.Предполагая, что я сделал выше, я бы включил еще один plan(multiprocess) звонок до furrr::future_map()?

1 Ответ

0 голосов
/ 18 февраля 2019

Автор фреймворка future здесь.

  • Q1.Функция, подобная purrr::map() в future.apply::future_apply(), также выполняется параллельно?

Нет.В 'purrr' нет ничего, что работает параллельно.

  • Q2.Что произойдет, если я запусту furrr::future_map() внутри функции future.apply()?

Она будет работать последовательно, то есть plan(sequential).Причина этого заключается в защите от рекурсивного вложенного параллелизма, который редко требуется.Это объясняется в будущей виньетке «Будущее за R: топологии будущего» * ​​1025 *.В некоторых случаях целесообразно использовать параллельный параллелизм, например распределенную обработку на нескольких машинах, когда вы, в свою очередь, выполняете параллельное соединение между несколькими ядрами на каждой машине.Это можно сделать с помощью

plan(list(tweak(cluster, workers = c("n1", "n2", "n3")), multisession))
  • Q3.Предполагая, что я сделал выше, я бы включил еще один plan(multiprocess) вызов до furrr::future_map()?

Вы не хотите устанавливать plan() "внутри" вашего кода / функций.Оставьте управление plan() тому, кто будет использовать ваш код / ​​вызывать ваши функции.Кроме того, никто не хочет использовать вложенное количество ядер, например, в plan(list(tweak(multisession, workers = ncores), tweak(multisession, workers = ncores))), потому что в нем будут использоваться ncores^2 ядер, которые будут перегружать ваш компьютер.Использование количества ядер по умолчанию в качестве plan(list(multisession, multisession)) не будет иметь этой проблемы, потому что на втором уровне все равно будет доступно только одно ядро.

...