J'ai besoin de prendre des données à partir de 1303 rasters (chaque raster a des données pendant 1 mois) et de faire une série chronologique pour chaque cellule de la grille dans les rasters. À la fin, je vais rejoindre toutes les séries chronologiques dans un fichier massif (zoo).Augmenter la performance/vitesse
J'ai le code qui peut le faire (j'ai essayé sur une petite partie de l'ensemble de données et cela a fonctionné) mais il semble prendre pour toujours juste pour empiler le raster (plus de 2 heures maintenant et comptant toujours) ce n'est pas la partie la plus lente, qui fera la série chronologique. Donc voici mon code, si quelqu'un connaît un moyen plus rapide d'empiler des rasters et/ou de créer des séries temporelles (peut-être sans la double boucle?) Merci de nous aider ...
Je ne connais pas d'autre langage de programmation mais Serait-ce trop demander à R?
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=",")
}
La question est, quelle partie du code prend combien de temps. La dernière double-boucle sera exécutée 360 * 720 fois, c'est beaucoup. Si vous avez plus d'un CPU, vous pouvez le faire en parallèle (regardez foreach). – smu
Je suis toujours aux prises avec l'importation de tous les fichiers, je pensais que le paquet raster serait la meilleure option après avoir lu quelques messages ici, mais je ne suis pas sûr que cela fonctionne pour 1303 fichiers. Mais read.table est encore pire! – sbg
Ensuite, le problème peut être le suivant: Pour chaque itération, R doit allouer un nouvel objet S avec une taille croissante. Cette allocation peut coûter beaucoup de temps. Il pourrait être plus rapide d'allouer s avant la boucle. Je vous donne un exemple trivial: votre chemin: 's = c()'; 'pour (i dans 1:10) {s <- c (s, rnorm (100))}' plus rapide: 's = rep (NA, 1000)'; 'pour (i dans seq (1,10 * 100,100)) {s [i: (i + 99)] <- rnorm (100)}' (désolé, cela semble moche comme un commentaire) – smu