R se bloque lors du traçage des fichiers de forme
Question
EDIT1: J'utilise Windows Vista et R 2.12.1
Je suis comploter 84 cartes avec spplot du paquet maptools. J'utilise deux, l'un pour viewports tracer la carte, et un pour tracer une tendance au fil du temps. Je l'ai écrit une boucle qui passe par chaque sous-ensemble des données, PLACETTES la carte avec la couleur des pays codés en fonction de leurs scores, et trace la tendance à ce score sur itérations. La boucle se présente comme suit:
##Read in the shape file, it is 48mb
eu27 <- readShapeSpatial("C:/Users/Thomas/Documents/EU27_shapefile/eu27_cyp.shp",proj4string=CRS ("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"))
##Drop not used variables from the shapefile data table
eu27@data <- data.frame(Order = 1:dim(eu27)[1], Country = as.character(eu27@data[,c("NAME_ISO")]))
##Fix longitude and lattitude for plotting later
xl <- c(-15,36)
yl <- c(33,73)
##Set the directory for storing the plots
setwd("C:/Users/Thomas/Documents/maps/")
##Define the breaks and colors
brks <- seq(0,8,1)
colcode <- terrain.colors(length(brks))
##Count used in the loop to keep track of iterations
count <- 1
##Vector to store the trend in time
total <- vector()
##Beginning of loop
for(i in 2001:2003){
for(j in 1:12){
##Subset the data and merge it with the shape file data table
dat <- d3[d3$Year == i & d3$Month == j, c("No","No.Neg","Country")]
eu27dat <- merge(eu27@data,dat, by="Country", all.x=TRUE)
eu27@data <- eu27dat[order(eu27dat$Order),]
eu27@data$tot <- eu27@data$No + eu27@data$No.Neg
##Store the map plot with countries color coded in the plot1 object
plot1 <- spplot(eu27, "tot", main = paste("Year: ",i,", Month: ",j, sep = ""), xlim=xl, ylim=yl, at = brks, col.regions = colcode)
##Remove the variables created
eu27@data$No <- NULL
eu27@data$No.Neg <- NULL
eu27@data$tot <- NULL
##Update the vector with trend data from the current iteration
total[count] <- sum(dat$No.Neg, na.rm = T)
##Store the trend data plot in the plot2 object
plot2 <-xyplot(total ~ 1:length(total), type = "b", xlab = "Time", ylab = "No Votes", ylim = c(-1,4))
##Open a PNG device
png(file = paste("mapNo",count,".png", sep = ""),width=20, height=12, units="cm",bg="white", pointsize=20, res=300)
##Create two viewports for the two plots created above
pushViewport(viewport(layout = grid.layout(1, 2, unit(c(2, 1), "null"))))
##Print plot1 in the first viewport
pushViewport(viewport(layout.pos.col = 1, layout.pos.row = 1))
print(plot1, newpage = F)
upViewport()
##Print plot2 in the second viewport
pushViewport(viewport(layout.pos.col = 2, layout.pos.row = 1))
print(plot2, newpage = F)
upViewport()
##Close the device
dev.off()
##Update the count
count <- count + 1
}
}
Le problème est que R se bloque après 8 itérations, je pense que je suis en quelque sorte je utilise d'énormes quantités de mémoire, mais je vraiment aucune idée de ce qui se passe.
EDIT2: Je reçois un message d'erreur windows qui dit (traduit de Germahn): Le R pour frontal Windows ne fonctionne pas plus
EDIT3: J'ai suivi l'utilisation de la mémoire de Windows gestionnaire de tâches, et après 8 itérations la mémoire est presque complètement épuisée.
EDIT4: Je reçois la même erreur lors de l'utilisation différents périphériques graphiques (png, jpeg, pdf). Je suis en mesure d'exécuter la boucle sans utiliser les fenêtres, donc je suis suspecter que cela est lié aux viewports.
Best, Thomas
La solution
Si cela fonctionne avec une petite shapefile, mais pas avec un grand un (et 48 Mo est un grand) alors oui, ce sera la mémoire. Une chose que j'ai vu parfois l'aide est de coller tout dans une boucle en fonction, de sorte que votre fichier ressemble à ceci:
for(i in 2001:2003){
for(j in 1:12){
doit(i,j,[etc])
}
}
Après chaque appel à doIT () beaucoup de choses, nous l'espérons se passer hors de portée et donc les déchets collectés. Je sais que cette astuce a travaillé avec les premières versions de R (et Splus), mais peut-être que tout a été fixé dès maintenant. Découvrez quelques-unes des fonctions de R liées à la mémoire pour obtenir une poignée sur votre utilisation de processus. Est-ce Windows ou Unix?