parSapply() verwenden
Zuvor haben wir folgendes Spiel gespielt:
- Initialisierung:
total = 0. - Würfle mit einem einzelnen Würfel und addiere das Ergebnis zu
total. - Wenn
totalgerade ist, setzetotalauf null zurück. - Wenn
totalgrößer als 10 ist, endet das Spiel.
Das Spiel kann mit der Funktion play() simuliert werden:
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
}
Um das Spiel 100 Mal zu simulieren, können wir eine for-Schleife oder sapply() verwenden:
res <- sapply(1:100, function(i) play())
Das eignet sich perfekt für paralleles Ausführen!
Um Funktionen auf einem Cluster verfügbar zu machen, verwendest du die Funktion clusterExport(). Diese nimmt einen Cluster und einen String mit dem Namen der Funktion entgegen.
clusterExport(cl, "some_function")
Diese Übung ist Teil des Kurses
<Kurs>Effizient R-Code schreiben</Kurs>Übungsanweisungen
Die Funktion play() ist in deinem Workspace definiert.
- Erstelle einen Cluster mit
makeCluster()und setze die Anzahl der Kerne auf 2. Speichere das Ergebnis incl. - Exportiere die Funktion
play()in den Cluster. - Schreibe die obige
sapply()-Funktion alsparSapply()um. - Beende den Cluster mit
stopCluster().
Interaktive praktische Übung
Versuche dich an dieser Übung, indem du diesen Beispielcode vervollständigst.
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
___