====== 1198. Sredin seminar: primeri ====== # PRIMER 1 # pokažimo kako se na koncept for loopa lahko obesi funkcijo iz družine *apply nek.vektor <- rep(NA, 10) set.seed(1) for (i in 1:length(nek.vektor)) { nek.vektor[i] <- mean(runif(1000)) } set.seed(1) nek.s <- 1:10 nek.s <- sapply(X = nek.s, FUN = function(x) { rezultat <- mean(runif(1000)) return(rezultat) }) identical(nek.s, nek.vektor) # PRIMER 2 # naredimo še en malo večji trivialen primer system.time( big.s <- sapply(X = 1:100, FUN = function(x) { mean(runif(10000000)) }) ) # system.time meri koliko časa se nek izraz (funkcija) izvaja # če zelim meriti več vrstic, moramo vrstice zaviti v oglate # oklepaje: #system.time({ # ... # ... #}) # PRIMER 3 # V tem primeru bomo pokazali kako inicializirati jedra in jim # poslati podatke (tudi funkcije) potrebne za računanje na več # jedrih. Podatke moramo v jedra poslati eksplicitno sami. # naložimo paket snowfall in inicializiramo 4 jedra library(snowfall) sfInit(parallel = TRUE, cpus = 4, type = "SOCK") # Napišimo funkcijo, ki vrednosti vektorja spremeni v 1 ali 0. # Funkcija je napisana zelo neoptimalno, tak način programiranja # močno odsvetujem. Več o tem na # http://www.burns-stat.com/pages/Tutor/R_inferno.pdf racunanjeSemPaTja <- function(x, y) { set.seed(x) rzlt <- .interna(runs = y) for (i in 1:length(rzlt)) { if (rzlt[i] >= 0.5) rzlt[i] <- 1 else rzlt[i] <- 0 } out <- table(rzlt) write.table(x = out, file = paste("simulacija_", x, ".txt", sep = "")) invisible(NULL) } # Pomožna funkcija, ki jo uporabimo znotraj funkcije # racunanjeSemPaTja kot primer, ko je potrebno funkcijo # poslati ostalim jedrom. .interna <- function(runs) { rzlt <- 0 for (i in 1:runs) { rzlt <- c(rzlt, runif(1)) } return(rzlt) } # nastavimo dolžino vektorja rns <- 30000 # Primer, ki kaže kako moramo izvoziti vse potrebne elemente # v vse sredice. sfExport(list = c(".interna", "rns")) pa.take.fore.para <- sfSapply(x = 1:12, fun = racunanjeSemPaTja, y = rns, simplify = FALSE) # na podoben nacin lahko uporabimo ostale funkcije družine apply # sfApply # sfLapply # sfRapply in sfCapply (še) nista implementirana # za load balancing je sfClusterApplyLB # implementacija na superračunalnik dokaj preprosta (velja za cloudnumbers.com) #sfInit(parallel = TRUE, cpus = 100, type = "MPI") [[vlado:pub:sreda|Sreda]]: [[vlado:pub:sreda:1198]]