'm c .cores'> 1 не поддерживается на Windows - PullRequest
1 голос
/ 29 мая 2020

Я новичок в программировании, и я пытаюсь использовать параллельную обработку для R в windows, используя существующий код.

Ниже приведен фрагмент моего кода:



if (length(grep("linux", R.version$os)) == 1){
    num_cores = detectCores()
    impact_list <- mclapply(len_a, impact_func, mc.cores = (num_cores - 1))
  } 
  # else if(length(grep("mingw32", R.version$os)) == 1){
  #   num_cores = detectCores()
  #   impact_list <- mclapply(len_a, impact_func, mc.cores = (num_cores - 1))
  # 
  # }
  else{
    impact_list <- lapply(len_a, impact_func)
  }
  return(sum(unlist(impact_list, use.names = F)))

Это работает нормально, я использую R на windows, поэтому код входит в оператор else, и он запускает код с помощью lapply (), а не путем параллельной обработки.


I добавили оператор else if, чтобы он работал для windows. Поэтому, когда я отменяю комментирование блока кода else if и запускаю его, я получаю сообщение об ошибке «m c .cores '> 1 не поддерживается на Windows». Подскажите, пожалуйста, как использовать параллельную обработку в windows, чтобы на выполнение кода уходило меньше времени. Любая помощь будет оценена по достоинству.

1 Ответ

0 голосов
/ 29 мая 2020

(отказ от ответственности: здесь я являюсь автором будущего фреймворка)

Пакет future.apply предоставляет параллельные версии встроенного в R "apply" функции. Это кроссплатформенный, т.е. работает на Linux, macOS и Windows. Пакет позволяет вам часто просто заменять существующий lapply() вызовом future_lapply(), например

library(future.apply)
plan(multisession)

your_fcn <- function(len_a) {
  impact_list <- future_lapply(len_a, impact_func)
  sum(unlist(impact_list, use.names = FALSE))
}

Что касается mclapply () как такового: если вы используете parallel::mclapply() в ваш код, убедитесь, что всегда есть опция не для его использования. Причина в том, что не гарантируется работа во всех средах, то есть он может быть нестабильным и cra sh R. В потоке R-devel 'mclapply возвращает NULL в MacOS при запуске GAM' (https://stat.ethz.ch/pipermail/r-devel/2020-April/079384.html ), автор mclapply() написал 2020-04-28:

НЕ используйте mcparallel () в пакетах, за исключением параметра, не являющегося параметром по умолчанию, который пользователь может установить по причинам, объясненным Хенриком. Multicore предназначен для приложений HP C, которым необходимо использовать много ядер для тяжелых вычислений, но он плохо работает с RStudio и, что более важно, вы не знаете доступных ресурсов, поэтому только пользователь может сказать вам, когда это безопасно использовать. Многоядерные машины часто используются совместно, поэтому использование всех обнаруженных ядер - очень плохая идея. Пользователь должен иметь возможность явно включить его, но по умолчанию он не должен быть включен.

...