Pakiet parallel - parSapply

Wydajny kod w R

Colin Gillespie

Jumping Rivers & Newcastle University

Rodzina apply

Istnieją równoległe wersje

  • apply()- parApply()
  • sapply()- parSapply()
    • stosowanie funkcji do wektora, czyli pętla for
  • lapply()- parLapply()
    • stosowanie funkcji do listy
Wydajny kod w R

Funkcja sapply()

sapply() to inny sposób zapisu pętli for

Pętla

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

Można zapisać jako

sapply(1:10, simulate)

Stosujemy funkcję do każdej wartości wektora

Wydajny kod w R

Przełączenie na parSapply()

Ta sama procedura!

  1. Załaduj pakiet
  2. Utwórz klaster
  3. Zmień na parSapply()
  4. Zatrzymaj!
Wydajny kod w R

Przykład: walki Pokémonów

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

Wydajny kod w R

Bootstrapping

W idealnym świecie próbkowalibyśmy z populacji, lecz nie jest to możliwe

Zakładamy, że oryginalna próba jest reprezentatywna dla populacji

  1. Próbkuj ze zwracaniem ze swoich danych
    • Ten sam punkt może pojawić się wielokrotnie
  2. Oblicz statystyki korelacji z nowej próby
  3. Powtórz
Wydajny kod w R

Pojedynczy bootstrap

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))
Wydajny kod w R

Konwersja na równoległy

  • Załaduj pakiet
  • Określ liczbę rdzeni
  • Utwórz obiekt klastra
  • Wyeksportuj funkcje/dane
  • Zmień na parSapply()
  • Zatrzymaj!
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)
Wydajny kod w R

Czasy wykonania

Wydajny kod w R

Czas na ćwiczenia!

Wydajny kod w R

Preparing Video For Download...