2017-02-28 7 views
1

Ich habe vier ziemlich große RasterStacks und möchte einige einfache Berechnungen an ihnen vornehmen. Wie kann ich diese Berechnungen beschleunigen? Ich habe this approach using overlay() gefunden, aber die Berechnungen dauern immer noch sehr lange.Wie beschleunigt man Berechnungen mit riesigen Rasterstapeln?

Mein RasterStacks (s1, s2, s3, s4) haben alle Dimensionen: 26, 76, 1976, 3805 (nrow, ncol, ncell, nlayers) und meine aktuellen Code sieht wie folgt aus:

out <- overlay(s1,s2,s3,s4, fun = function(rs1,rs2,rs3,rs4) {return((rs1+rs2-rs3-rs4)*1e3)}) 

Irgendwelche Ideen?

EDIT: ein RasterStack zu erzeugen (zB s1) können Sie die folgende Funktion aufrufen:

create_stack <- function(num.col,num.row,num.lay){ 
    r <- raster(matrix(runif(num.row*num.col,0,10), ncol=num.col, nrow=num.row), 
     xmn=0, xmx=num.col, ymn=0, ymx=num.row) 
    ll <- replicate(num.lay , r) 
    return(stack(ll)) 
} 

library(raster) 
s1 <- create_stack(76,26,3805) 
+0

Bitte geben Sie ein [reproduzierbar] (http://stackoverflow.com/q/5963269/3250126) Beispiel. – loki

+0

Sie können versuchen, Ihre RasterStacks mit dem 'ff'-Paket in ein großes dreidimensionales Array zu konvertieren und dann stattdessen Ihre Berechnung durchzuführen. Das ff-Paket ist effizienter für Berechnungen, aber die Übertragung von 'raster' nach' ff' zurück nach 'raster' kann auch einige Zeit in Anspruch nehmen. – Bastien

Antwort

1

In Ihrem speziellen Problem

out <- (s1 + s2 - s3 - s4) * 1e3 

scheint der schnellste Weg, um Ihre Funktion anzuwenden . Für andere Probleme sollten Sie jedoch einen Blick auf die clusterR()-Funktion werfen. Sie können Funktionen parallelisieren.

„Zum Beispiel arbeitet es mit calc und es funktioniert auch mit Overlay solange Sie eine einzelne RasterStack oder RasterBrick als erstes Argument liefern.“

Mit Ihrer Funktion erstelle ich dieses Arbeitsbeispiel:

create_stack <- function(num.col,num.row,num.lay){ 
    r <- raster(matrix(runif(num.row*num.col,0,10), ncol=num.col, nrow=num.row), 
       xmn=0, xmx=num.col, ymn=0, ymx=num.row) 
    ll <- replicate(num.lay , r) 
    return(stack(ll)) 
} 


library(raster) 
s1 <- create_stack(76,26,3805) 
s2 <- create_stack(76,26,3805) 
s3 <- create_stack(76,26,3805) 
s4 <- create_stack(76,26,3805) 


beginCluster() 
out <- clusterR(s1, fun = function(x,s2,s3,s4) {return((x + s2 - s3 - s4)*1e3)}, 
       args = list(s2 = s2, s3 = s3, s4 = s4), progress = "text") 
endCluster() 

Als eine Spitze im Allgemeinen erleben ich, dass Aufruf

beginCluster() 

vom raster Paket am Anfang eines Segments Mit vielen Rasterberechnungen kann man unbekannte Vorteile bringen, da viele raster Funktionen bereits zur parallelen Berechnung implementiert sind.

+0

Danke. Ich habe eine Funktion hinzugefügt, um die Rasterstacks meiner Dimensionen zu reproduzieren. Leider kann ich Ihren Code nicht ausführen. Das Problem könnte mit [dieser Frage] zusammenhängen (http://stackoverflow.com/questions/35369137/clusterr-with-multiple-raster-stacks) ?! – moremo

+0

Danke, jetzt läuft Ihr Code. Hast du deine Laufzeit gestoppt, wenn du einen Leistungszuwachs bekommst? Ich habe es mit nur 100 Layern getestet und habe für meine ursprüngliche Herangehensweise diese Maße: 'user: 81.791 system: 0.68 weapon: 84.40'. Mit 4 Knoten mit Ihrem Code habe ich '0.125 System: 0.018 verstrichen: 95.32'. Laut [dieser Antwort] (http: // stackoverflow.com/questions/18654497/mclapply-user-time-größer als die verstrichene Zeit) die "Benutzer" -Zeit sollte die Summe aller Knoten sein, aber woher kommt dann die längere "verstrichene" Zeit mit Ihrem Ansatz? – moremo

+0

Nach [hier] (http://stackoverflow.com/questions/13688840/whatcaused-my-elapsed-time-much-longer-than-user-time) könnte das Lesen und Schreiben auf die Festplatte (Raster tmpdir) sein das Problem. – moremo

2

Die Erhöhung der chuncksize hilft viel im Umgang mit großen Rastern. Außerdem empfehle ich, alle temporären Dateien in ein Verzeichnis zu schreiben, das Sie einfach verwalten können.

library(raster) 
rasterOptions(tmpdir="C:\\",tmptime = 24,progress="text",timer=TRUE,overwrite = T,chunksize=2e+08,maxmemory=1e+8) 
+0

Danke für deinen Kommentar und deine gegebenen rasterOptions-Einstellungen! Ich habe meine rasterOptions in meinem .Rprofile nach deinem Kommentar geändert, aber bisher habe ich noch keinen großen Leistungszuwachs bemerkt ... – moremo

+0

Du kannst auch 'parallel processing' versuchen, während du' chunksize' hochhältst. In meinem Fall hat allein das Erhöhen der "Chunksize" die Verarbeitungszeit halbiert. –