我得到一个错误:在循环中使用栅格进行计算时,无法分配大小为1003.7 Mb的向量。奇怪的是,我最大的栅格只有7000KB。 我正在使用的代码是:
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)
}
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,7mB的向量。
答案 0 :(得分:0)
我不知道为什么会这样。但这似乎有很多方法可以使您的代码运行得更好,尽管鉴于您没有提供数据和不完整的代码,要提供帮助却很棘手。
我建议使用像这样的内存安全功能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)
}