2011-01-17 2 views
0

edit1: Я использую Windows Vista с и R 2.12.1R сбой при построении файлов фонтов

Я черчения 84 карты с spplot из пакета maptools. Я использую два видовых экрана, один для построения карты, и один для построения тенденции с течением времени. Я написал цикл, который проходит через каждый поднабор данных, отображает карту со странами, закодированными цветом в соответствии с их оценками, и отображает тенденцию в этом счете за итерации. Цикл выглядит следующим образом:

##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 
} 
} 

Проблема заключается в том, что R падает после 8 итераций, я подозреваю, что-то я использую огромные объемы памяти, но я действительно не имею ни малейшего представления о том, что происходит.

EDIT2: Я получаю сообщение об ошибке окна, которое говорит (в переводе с Germahn): The R для Windows, передний конец не функционирует больше

EDIT3: Я мониторинга использования памяти в диспетчере задач Windows , а после 8 итераций память почти полностью израсходована.

EDIT4: Я получаю ту же ошибку при использовании разных графических устройств (png, jpeg, pdf). Мне удалось запустить цикл без использования видовых экранов, поэтому я подозреваю, что это связано с видовыми экранами.

Best, Томас

+0

Что вы имеете в виду с R аварий? Как он автоматически завершает или возвращает ошибку или даже что-то другое? Если это проблема с памятью, и вы используете окна, попробуйте запустить R с параметром командной строки '--max-mem-size = 2047M'. – Henrik

+0

Открыв диспетчер задач, вы можете увидеть объем используемой памяти (или доступной) на вкладке «Производительность». Это должно дать вам некоторые подсказки, если ваша программа действительно имеет проблемы с памятью. –

+0

Возможно, это устройство png. Вместо этого попробуйте использовать pdf. Смотрите также: http://stackoverflow.com/questions/4270349/ggsave-png-error-with-larger-size BTW: проще, если вы укажете, какую версию R и используемую ОС вы используете. Некоторые вещи исправлены. Также вы получите интересную ошибку. –

ответ

2

Если он работает с небольшим шейпом, но не с большим (один и 48Mb большой один), то да, это будет память. Одна вещь, которую я видел иногда помощь придерживаться все в цикле в функцию, так что ваш файл выглядит следующим образом:

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

После каждого вызова пустяк() много вещей, мы надеемся, будет выходить за рамки и, таким образом, сбор мусора. Я знаю, что этот трюк работал с ранними версиями R (и Splus), но, возможно, теперь все исправлено. Проверьте некоторые из функций R, связанных с памятью, чтобы получить дескриптор использования вашего процесса. Это Windows или Unix?

+0

@Spacedman: Это не проблема R, а проблема png. Управление памятью в R не поможет. См. Также: http://stackoverflow.com/questions/4270349/ggsave-png-error-with-larger-size –

+0

@Joris Эта ссылка, по-видимому, подсказывает мне, что основная проблема связана с памятью и вероятно, сделать с ограничением до 2 ГБ (или 4 ГБ на 64-битной Windows) в 32-битном процессе. –

+0

@David: Действительно, это связано с памятью, но не может быть разрешено в R. Не с установкой пределов выше (у меня было 6 ГБ в то время, когда я тестировал), а не с помощью сбора мусора, а не с очисткой окружающей среды. Я не ошибаюсь, но ручное управление памятью в R не решит. Обновление, надеюсь, будет. –

Смежные вопросы