Error in Loop: Error: cannot allocate vector of size 1003.7 Mb
Error in Loop: Error: cannot allocate vector of size 1003.7 Mb
我收到错误:在循环中对栅格进行计算时无法分配大小为 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 的矢量。
我不知道为什么会这样。但似乎有一些方法可以使您的代码 运行 变得更好,尽管鉴于您没有提供数据且代码不完整,很难提供帮助。
我建议使用内存安全函数 reclassify
而不是 rangeFun
:
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)
}
我收到错误:在循环中对栅格进行计算时无法分配大小为 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 的矢量。
我不知道为什么会这样。但似乎有一些方法可以使您的代码 运行 变得更好,尽管鉴于您没有提供数据且代码不完整,很难提供帮助。
我建议使用内存安全函数 reclassify
而不是 rangeFun
:
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)
}