2011-01-17 15 views
0

EDIT1: Ich benutze Windows Vista und R 2.12.1R stürzt ab, wenn Form Plotten Dateien

Ich Plotten 84 Karten mit spplot vom MapTools Paket. Ich verwende zwei Ansichtsfenster, eines zum Zeichnen der Karte und eines zum Zeichnen eines Trends im Laufe der Zeit. Ich habe eine Schleife geschrieben, die jede Teilmenge der Daten durchläuft, die Karte mit farbcodierten Ländern nach ihren Bewertungen grafisch darstellt und den Trend in dieser Punktzahl über Iterationen hinweg darstellt. Die Schleife sieht wie folgt aus:

##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 
[email protected] <- data.frame(Order = 1:dim(eu27)[1], Country = as.character([email protected][,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([email protected],dat, by="Country", all.x=TRUE) 
    [email protected] <- eu27dat[order(eu27dat$Order),] 
    [email protected]$tot <- [email protected]$No + [email protected]$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 
    [email protected]$No <- NULL 
    [email protected]$No.Neg <- NULL 
    [email protected]$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 
} 
} 

Das Problem ist, dass R nach 8 Iterationen abstürzt, vermute ich, dass ich irgendwie riesige Mengen an Speicher bin mit, aber ich habe wirklich keine Ahnung, was los ist.

EDIT2: Ich bekomme eine Windows-Fehlermeldung, die besagt, (von Germahn übersetzt): Die R für Windows-Frontend funktioniert nicht mehr

EDIT3: Ich habe aus dem Windows Task-Manager, die Speicherverwendung worden Überwachung , und nach 8 Iterationen ist der Speicher fast vollständig verbraucht.

EDIT4: Ich bekomme den gleichen Fehler bei der Verwendung verschiedener Grafikgeräte (PNG, JPEG, PDF). Ich konnte die Schleife ausführen, ohne die Ansichtsfenster zu verwenden, daher vermute ich, dass dies mit den Ansichtsfenstern zusammenhängt.

Best, Thomas

+0

Was meinst du mit R crashes? Wie es automatisch endet, oder einen Fehler oder sogar etwas anderes zurückgibt? Wenn es sich um ein Speicherproblem handelt und Sie Windows verwenden, versuchen Sie, R mit '--max-mem-size = 2047M' als Befehlszeilenparameter zu starten. – Henrik

+0

Durch Öffnen des Task-Managers können Sie die Menge des verwendeten Speichers (oder verfügbar) unter der Registerkarte Leistung sehen. Das sollte Ihnen Hinweise geben, wenn Ihr Programm tatsächlich Speicherprobleme hat. –

+0

Es könnte das Png-Gerät sein. Versuchen Sie stattdessen, pdf zu verwenden. Siehe auch: http://stackoverflow.com/questions/4270349/ggsave-png-error-with-larger-size BTW: Es ist einfacher, wenn Sie erwähnen, welche R-Version und Betriebssystem Sie verwenden. Einige Dinge wurden behoben. Auch der Fehler, den Sie bekommen, wäre interessant. –

Antwort

2

Wenn es mit einer kleinen Shape-Datei funktioniert, aber nicht mit einem großen einem (und 48 MB sind ein großer) dann ja, es wird Speicher sein. Eine Sache, die ich gesehen habe manchmal Hilfe ist alles in einer Schleife in eine Funktion zu halten, so dass Ihre Datei sieht wie folgt aus:

for(i in 2001:2003){ 
for(j in 1:12){ 
    doit(i,j,[etc]) 
    } 
} 

Nach jedem Aufruf von doit() viele Dinge hoffentlich außerhalb des Gültigkeitsbereichs gehen und so Müll gesammelt. Ich weiß, dass dieser Trick mit frühen Versionen von R (und Splus) funktioniert hat, aber vielleicht ist das jetzt alles behoben. Sehen Sie sich einige der R-Funktionen an, die sich auf den Arbeitsspeicher beziehen, um einen Überblick über Ihre Prozessauslastung zu erhalten. Ist das Windows oder Unix?

+0

@Spacedman: Dies ist nicht so sehr ein R-Problem, sondern ein Png-Problem. Speicherverwaltung in R wird nicht viel helfen. Siehe auch: http://StackOverflow.com/Questions/4270349/Ggsave-Png-error-with-larger-size –

+0

@Joris Dieser Link scheint zu deuten, zumindest für mich, dass das zugrunde liegende Problem mit Speicher und ist wahrscheinlich mit Beschränkung auf 2 GB (oder 4 GB auf 64-Bit-Windows) in einem 32-Bit-Prozess zu tun. –

+0

@David: In der Tat ist es Speicher-bezogen, kann aber nicht in R aufgelöst werden. Nicht mit der Festlegung der Grenzen höher (Ich hatte 6 GB zu der Zeit, die ich getestet), nicht mit Garbage Collection, nicht mit der Reinigung der Umwelt. Ich habe es vielleicht falsch formuliert, aber das manuelle Speichermanagement in R wird es nicht lösen. Aktualisieren wird R hoffentlich. –