循环错误:错误:无法分配大小为1003.7 Mb的向量

时间:2018-10-17 20:05:19

标签: loops memory vector raster

我得到一个错误:在循环中使用栅格进行计算时,无法分配大小为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的向量。

1 个答案:

答案 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)
}