Ich muss Daten aus 1303 Rastern nehmen (jedes Raster hat Daten für 1 Monat) und eine Zeitreihe für jede Rasterzelle in den Rastern erstellen. Am Ende werde ich alle Zeitreihen zu einer riesigen (Zoo-) Datei zusammenfügen.Leistung/Geschwindigkeit erhöhen
Ich habe den Code, der es tun kann (Ich versuchte einen kleinen Teil des Datasets und es funktionierte), aber es scheint für immer nur das Raster zu stapeln (mehr als 2 Stunden jetzt und immer noch gezählt) und das ist nicht der langsamere Teil, der die Zeitreihe machen wird. Also hier ist mein Code, wenn jemand einen schnelleren Weg zum Stapeln von Rastern kennt und/oder um die Zeitreihe zu erstellen (vielleicht ohne Doppelschleife?) Bitte helfen ...
Ich kenne keine andere Programmiersprache aber Wäre das zu viel von R zu fragen?
files <- list.files(pattern=".asc")
pat <- "^.*pet_([0-9]{1,})_([0-9]{1,}).asc$"
ord_files <- as.Date(gsub(pat, sprintf("%s-%s-01", "\\1", "\\2"), files))
files<-files[order(ord_files)]
#using "raster" package to import data
s<- raster(files[1])
pet<-vector()
for (i in 2:length(files))
{
r<- raster(files[i])
s <- stack(s, r)
}
#creating a data vector
beginning = as.Date("1901-01-01")
full <- seq(beginning, by='1 month', length=length(files))
dat<-as.yearmon(full)
#building the time series
for (lat in 1:360)
for (long in 1:720)
{
pet<-as.vector(s[lat,long])
x <- xts(pet, dat)
write.zoo(x,file=paste("P:/WRSRL/Users1/ncgk/IBERIA/cru_pet/zoo/","lat",lat,"long",long,".csv", sep="") , sep=",")
}
Die Frage ist, welcher Teil des Codes nimmt, wie viel Zeit. Die letzte Doppelschleife wird 360 * 720 mal ausgeführt, das ist viel. Wenn Sie mehr als eine CPU haben, können Sie parallel einlaufen (schauen Sie sich foreach an). – smu
Ich habe immer noch Probleme mit dem Import aller Dateien, ich dachte, das Raster-Paket wäre die beste Option nach dem Lesen ein paar Posts hier, aber ich bin mir nicht sicher, es funktioniert für 1303 Dateien. Aber "read.table" ist noch schlimmer! – sbg
Dann kann das Problem das folgende sein: Für jede Iteration muss R ein neues Objekt S mit zunehmender Größe zuweisen. Diese Zuweisung kann viel Zeit kosten. Es könnte schneller sein, s vor der Schleife zuzuweisen. Ich gebe Ihnen ein triviales Beispiel: Ihr Weg: 's = c()'; 'für (i in 1:10) {s <- c (s, rnorm (100))}' schneller: 's = rep (NA, 1000)'; 'für (i in seq (1,10 * 100,100)) {s [i: (i + 99)] <- rnorm (100)}' (Entschuldigung, das sieht hässlich aus wie ein Kommentar) – smu