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")

Sreda: 1198

vlado/pob/sreda/supp/1198.txt · Last modified: 2011/11/29 13:52 by vlado
 
Except where otherwise noted, content on this wiki is licensed under the following license: CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki