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

Était-ce utile?

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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top