Ошибка в цикле: ошибка: невозможно выделить вектор размером 1003,7 Мб - PullRequest
0 голосов
/ 17 октября 2018

Я получаю сообщение об ошибке: не удается выделить вектор размером 1003,7 Мб при выполнении расчетов с растрами в цикле.Странно то, что мой самый большой растр имеет только 7000 КБ.Код, который я использую:

список файлов из папки

ultrablue <- list.files(path = "C:/Users/Felix/Desktop/Bachelorarbeit/Daten/Datenverarbeitung_R/L1C_clipped_copied",
                    pattern = 'B01.jp2$', full.names=T)
blue <- list.files(path = "C:/Users/Felix/Desktop/Bachelorarbeit/Daten/Datenverarbeitung_R/L1C_clipped_copied",
               pattern = 'B02.jp2$', full.names=T)
green <- list.files(path = "C:/Users/Felix/Desktop/Bachelorarbeit/Daten/Datenverarbeitung_R/L1C_clipped_copied",
                pattern = 'B03.jp2$', full.names=T)
red <- list.files(path = "C:/Users/Felix/Desktop/Bachelorarbeit/Daten/Datenverarbeitung_R/L1C_clipped_copied",
              pattern = 'B04.jp2$', full.names=T)
redge1 <- list.files(path = "C:/Users/Felix/Desktop/Bachelorarbeit/Daten/Datenverarbeitung_R/L1C_clipped_copied",
                 pattern = 'B05.jp2$', full.names=T)
redge2 <- list.files(path = "C:/Users/Felix/Desktop/Bachelorarbeit/Daten/Datenverarbeitung_R/L1C_clipped_copied",
                 pattern = 'B06.jp2$', full.names=T)
redge3 <- list.files(path = "C:/Users/Felix/Desktop/Bachelorarbeit/Daten/Datenverarbeitung_R/L1C_clipped_copied",
                 pattern = 'B07.jp2$', full.names=T)
NNIR <- list.files(path = "C:/Users/Felix/Desktop/Bachelorarbeit/Daten/Datenverarbeitung_R/L1C_clipped_copied",
               pattern = 'B8A.jp2$', full.names=T)

определение функции, которая используется в цикле

  rangeFun <- function(x){
  x[x > 10000 | x < 0] <- NA
  return(x)
}

loop

   for(i in seq_along(ultrablue))
   {

  range_B1 <- rangeFun(raster(ultrablue[i]))
  range_B2 <- rangeFun(raster(blue[i]))
  range_B3 <- rangeFun(raster(green[i]))
  range_B4 <- rangeFun(raster(red[i]))
  range_B5 <- rangeFun(raster(redge1[i]))
  range_B6 <- rangeFun(raster(redge2[i]))
  range_B7 <- rangeFun(raster(redge3[i]))
  range_B8A <- rangeFun(raster(NNIR[i]))

создавать имена

  sat = 'S2_'
  path = substr(ultrablue[i], 84, 90)
  date = substr(ultrablue[i], 91, 98)

сохранять файлы

 setwd("C:/Users/Felix/Desktop/Bachelorarbeit/Daten/Datenverarbeitung_R/L1C_clip_range")
  writeRaster(range_B1,filename = paste0(sat, path, date,'_B1','.tif'))
  writeRaster(range_B2,filename = paste0(sat, path, date,'_B2','.tif'))
  writeRaster(range_B3,filename = paste0(sat, path, date,'_B3','.tif'))
  writeRaster(range_B4,filename = paste0(sat, path, date,'_B4','.tif'))
  writeRaster(range_B5,filename = paste0(sat, path, date,'_B5','.tif'))
  writeRaster(rrange_B6,filename = paste0(sat, path, date,'_B6','.tif'))
  writeRaster(range_B7,filename = paste0(sat, path, date,'_B7','.tif'))
  writeRaster(range_B8A,filename = paste0(sat, path, date,'_B8A','.tif'))

  removeTmpFiles(h=0.1)
  }

Я не совсем понимаю, из какой части моего кода создается вектор размером 1003,7 мБ.

1 Ответ

0 голосов
/ 18 октября 2018

Я не знаю, почему это происходит.Но, похоже, есть способы заставить ваш код работать лучше, хотя это сложно, учитывая, что вы не предоставляете никаких данных и неполный код.

Вместо rangeFun Я бы предложил использовать функцию безопасной памяти reclassify вот так:

m <- rbind(c(-Inf, 0, NA), c(1000, Inf, NA))
reclassify(x, m, filename="")

Кажется, что весь ваш сценарий может быть уменьшен до чего-то вроде этого:

inf <- list.files(pattern = 'B..\\.jp2$', full.names=TRUE)
path <- substr(inf, 84, 90)
date <- substr(inf, 91, 98)
band <- gsub('0', '', substr(basename(inf), 1, 3))
outf <- paste0('S2_', path, date, '_', band ,'.tif')
m <- rbind(c(-Inf, 0, NA), c(1000, Inf, NA))

for (i in seq_along(inf)) {
    y <- reclassify(raster(inf[i]), m, filename=outf[i], overwrite=TRUE)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...