2015-10-08 1 views
0

J'ai utilisé le paquet R raster depuis longtemps, mais maintenant je ne peux vraiment pas comprendre ce problème de cluster. Je dois calculer l'indice SPI pour un raster netCDF. Ceci est fait pour chaque cellule, en prenant les timeseries de la cellule et en retournant la temporisation de l'index SPI pour cette cellule.clusterR renvoie «l'argument est de longueur zéro»

L'exemple de fichier d'entrée (environ 4 Mo) peut être trouvé here.

Voir le code ci-dessous:

library(raster) 
library(SPEI) 

calcspi <- function(pr) { #this function calculates the SPI index for each timeseries of values 
    pr <- as.numeric(pr) 
    if (all(is.na(pr[1:20]))) { #Check that this is not an NA cell 
     outspi <- rep(NA, length(pr)) 
    } else { 
     outspi <- fitted(spi(pr, 12, na.rm=TRUE)) 
    } 
    return(outspi) 
} 

b <- brick("input_crop.nc", varname="pr") 
readAll(b) #As requested in the comments 

###THIS WORKS BUT IS SLOW: 
bc <- calc(b, calcspi) 

###THIS DOES NOT: 
beginCluster(n=4) 

bc <- clusterR(b, calc, args=list(fun="calcspi")) 
#[1] "argument is of length zero" 
#attr(,"class") 
#[1] "snow-try-error" "try-error" 
#Error in clusterR(b, calc, args = list(fun = "calcspi")) : cluster error 

endCluster() 

###THIS DOESN'T EITHER: 
beginCluster(n=4) 

f <- function(x) calc(x, calcspi) 
bc <- clusterR(b, f) 
#[1] "argument is of length zero" 
#attr(,"class") 
#[1] "snow-try-error" "try-error" 
#Error in clusterR(b, f) : cluster error 

endCluster() 

traceback() est tout à fait inutile dans ce cas. Qu'est-ce qui ne va pas?

+0

Cela peut être lié à raster ne pas être en mesure de détecter, dans l'environnement de cluster, quel paquet NCDF que vous utilisez. Pouvez-vous essayer 'b <- b * 1' (ou quelque chose d'équivalent pour copier les valeurs du fichier ncdf d'abord)? – RobertH

+0

Si vous fournissez une version rognée du fichier source netCDF, nous pourrions jouer avec le problème, peut-être regarder des options au-delà de vos tentatives ci-dessus. data.table .. – shekeine

+0

Plutôt, fournissez un exemple qui ne nécessite pas de fichier (à moins que ce soit la cause du problème) – RobertH

Répondre

1

Cela a fonctionné pour moi:

b <- mybrick 
#readAll(b) #As requested in the comments 
#parallel processing 
ff <- function(x) calc(x, calcspi) 
beginCluster(8) 
bc <- clusterR(b, fun = ff,export='calcspi') 
endCluster() 
+0

En fait, il semble que la version normale de 'calc()' est assez rapide maintenant (cela prend seulement 3 secondes), au moins pour l'exemple de jeu de données. Probablement à cause d'une amélioration du code. Pourtant, votre solution est en effet valable, bonne prise! – AF7