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