НачатьНачать бесплатно

Использование parSapply()

Ранее мы моделировали следующую игру:

  • Инициализация: total = 0.
  • Бросаем одну кость и прибавляем выпавшее значение к total.
  • Если total чётное, сбрасываем total в ноль.
  • Если total больше 10 — игра завершается.

Для симуляции игры использовалась функция play():

play <- function() {
  total <- no_of_rolls <- 0
  while(total < 10) {
    total <- total + sample(1:6, 1)

    # If even. Reset to 0
    if(total %% 2 == 0) total <- 0 
    no_of_rolls <- no_of_rolls + 1
  }
  no_of_rolls
}

Чтобы запустить симуляцию 100 раз, можно воспользоваться циклом for или функцией sapply():

res <- sapply(1:100, function(i) play())

Это отличный кандидат для параллельного выполнения!

Чтобы сделать функции доступными на кластере, используйте функцию clusterExport(). Она принимает кластер и строку с именем функции.

clusterExport(cl, "some_function")

Это упражнение является частью курса

Эффективный код на R

Посмотреть курс

Инструкции к упражнению

Функция play() уже определена в вашем рабочем пространстве.

  • Создайте кластер с помощью makeCluster(), указав количество ядер равным 2. Сохраните результат в переменную cl.
  • Экспортируйте функцию play() на кластер.
  • Перепишите вызов sapply(), заменив его на parSapply().
  • Остановите кластер с помощью stopCluster().

Интерактивное практическое упражнение

Попробуйте выполнить это упражнение, дополнив этот пример кода.

library("parallel")
# Create a cluster via makeCluster (2 cores)
cl <- ___

# Export the play() function to the cluster
___

# Re-write sapply as parSapply
res <- sapply(1:100, function(i) play())

# Stop the cluster
___
Редактировать и запускать код