Пакет parallel — parSapply

Ефективне програмування R

Colin Gillespie

Jumping Rivers & Newcastle University

Сімейство apply

Існують паралельні версії

  • apply()parApply()
  • sapply()parSapply()
    • застосування функції до вектора, тобто цикл for
  • lapply()parLapply()
    • застосування функції до списку
Ефективне програмування R

Функція sapply()

sapply() — це інший спосіб записати цикл for

Цикл

for(i in 1:10)
    x[i] <- simulate(i)

Можна записати як

sapply(1:10, simulate)

Ми застосовуємо функцію до кожного значення вектора

Ефективне програмування R

Перехід на parSapply()

Той самий рецепт!

  1. Завантажте пакет
  2. Створіть кластер
  3. Перейдіть на parSapply()
  4. Зупиніть!
Ефективне програмування R

Приклад: бої Pokemon

plot(pokemon$Defense, pokemon$Attack)
abline(lm(pokemon$Attack ~ pokemon$Defense), col = 2)
cor(pokemon$Attack, pokemon$Defense)
0.437

Ефективне програмування R

Бутстреп

В ідеалі ми б повторно вибірковували з генеральної сукупності; але це неможливо

Натомість припускаємо, що початкова вибірка репрезентує сукупність

  1. Вибирайте з повтореннями з ваших даних
    • Точка може трапитися кілька разів
  2. Обчисліть кореляцію на новій вибірці
  3. Повторюйте
Ефективне програмування R

Один бутстреп

bootstrap <- function(data_set) {
    # Sample with replacement
    s <- sample(1:nrow(data_set), replace = TRUE)
    new_data <- data_set[s,]

    # Calculate the correlation
    cor(new_data$Attack, new_data$Defense)
}
# 100 independent bootstrap simulations
sapply(1:100, function(i) bootstrap(pokemon))
Ефективне програмування R

Перехід на паралельне виконання

  • Завантажте пакет
  • Вкажіть кількість ядер
  • Створіть об'єкт кластера
  • Експортуйте функції/дані
  • Перейдіть на parSapply()
  • Зупиніть!
library("parallel")
no_of_cores <- 7
cl <- makeCluster(no_of_cores)
clusterExport(cl,
  c("bootstrap", "pokemon"))
parSapply(cl, 1:100,
  function(i) bootstrap(pokemon))
stopCluster(cl)
Ефективне програмування R

Час виконання

Ефективне програмування R

Давайте потренуємось!

Ефективне програмування R

Preparing Video For Download...