我正在尝试使用ecoclim软件包创建19个生物气候变量,该软件包包含一个函数biovariables,该函数类似于dismo软件包中的函数,但有一些细微的差异。我运行的代码如下:
s <- stack(prcp, tmax, tmin) # prcp, tmax, and tmin are climate rasters
# cluster setup
cpus <- 2
cl <- makeCluster(cpus)
registerDoParallel(cl)
# compute biovars
nchunks <- cpus
r <- foreach(i=1:nchunks,
.packages=c("raster", "ecoclim")) %dopar% {
rasterOptions(tmpdir="D:\\latjam\\RTempDir")
tile <- partitionRaster(s, nchunks, i, subextent=ext)
calc(tile, fun=function(x)biovariables(x))
}
stopCluster(cl)
save(r, file=paste0(ouptput.path, "\\biovars.RData")
# combine tiles and save
r <- do.call("merge", r)
names(r) <- c("bio1", "bio2", "bio3", "bio4", "bio5", "bio6", "bio7", "bio8", "bio9", "bio10", "bio11", "bio12", "bio13", "bio14", "bio15", "bio16", "bio17", "bio18", "bio19")
writeRaster(r, filename=paste0(output.path), format="GTiff", bylayer=TRUE, suffix=names(r), overwrite=TRUE)
这花了大约6天的时间(不是在我的笔记本电脑上运行的,该笔记本电脑不是为执行此类繁重的计算任务而设计的),而在那段时间的最后,生物变量的创建似乎奏效了,但没有合并。
这是我得到的错误:
Error in dim(res) <- c(ncols, raster@data@nlayers * nrows) :
dims [product 4926168] do not match the length of object [0]
In addition: There were 50 or more warnings (use warnings() to see the first 50)
所有警告均与此类似:
Warning messages:
1: In writeBin(as.vector(v[start:end, ]), x@file@con, size = x@file@dsize) :
problem writing to connection
2: In writeBin(as.vector(v[start:end, ]), x@file@con, size = x@file@dsize) :
problem writing to connection
3: In writeBin(as.vector(v[start:end, ]), x@file@con, size = x@file@dsize) :
problem writing to connection
这与here中讨论的有关此过程的dismo软件包版本的问题非常相似,事实证明这是一个错误(正如dismo的作者之一Robert Hijmans指出的)。不过,我不确定是否/如何与我当前的问题相关,因为1)该帖子是几年前的,而2)它是指不同的程序包(尽管错误完全相同)。>
biovariables函数似乎起作用了,因为当我打印变量“ r”时,它表明它是一个包含两个栅格砖的列表,每个栅格砖有19层(请注意,我分别更改了每个栅格砖的层名称(即,names(r [[{2]] <-c(“ bio1”,...),因为上面的脚本在到达该行之前失败了:
> r
[[1]]
class : RasterBrick
dimensions : 46812, 28808, 1348560096, 19 (nrow, ncol, ncell, nlayers)
resolution : 0.0002777778, 0.0002777778 (x, y)
extent : -108.0017, -99.99944, 24.99833, 38.00167 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=NAD83 +no_defs +ellps=GRS80 +towgs84=0,0,0
data source : E:\latjam\RTempDir\r_tmp_2018-07-10_074433_1460_37587.grd
names : bio1, bio2, bio3, bio4, bio5, bio6, bio7, bio8, bio9, bio10, bio11, bio12, bio13, bio14, bio15, ...
min values : 355.49428, -30.54803, -38.78388, 29.11857, 570.40875,
143.34456, 78.76477, 483.32777, 231.66794, 483.32777, 231.66794, 374.92570, 116.42382, -63.54390, 34.71124, ...
max values : 754.37680, 368.53211, 50.35605, 180.41047, 1058.88306, 528.83374, 786.51141, 879.90896, 703.44998, 885.57367, 619.41184, 4850.45081, 702.15985, 166.85643, 217.05643, ...
[[2]]
class : RasterBrick
dimensions : 46812, 28808, 1348560096, 19 (nrow, ncol, ncell, nlayers)
resolution : 0.0002777778, 0.0002777778 (x, y)
extent : -100.0006, -91.99833, 24.99833, 38.00167 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=NAD83 +no_defs +ellps=GRS80 +towgs84=0,0,0
data source : E:\latjam\RTempDir\r_tmp_2018-07-10_073256_2256_72283.grd
names : bio1, bio2, bio3, bio4, bio5, bio6, bio7, bio8, bio9, bio10, bio11, bio12, bio13, bio14, bio15, ...
min values : 546.52371, 65.88422, 27.78071, 52.07848, 740.37781,
171.56345, 210.77826, 488.27865, 324.20001, 681.26182, 324.20001, 1761.78778, 248.91402, 50.35446, 10.85425, ...
max values : 767.22937, 287.67553, 45.61213, 182.14504, 1006.36127, 555.46893, 770.77739, 866.80438, 831.02033, 879.99723, 646.40201, 6514.58429, 717.35217, 449.91504, 62.39409, ...
因此,我尝试了几种方法来逐层保存图层。首先,我的计划是保存每个积木的每一层,然后在事实之后合并相关的图层(例如,保存r [[{1]中的bio1和r [[{2]中的bio1)然后合并它们,依此类推),但出现错误:
> for(i in 1:19){
+ writeRaster(r[[1]][[i]], filename=paste0(output.path, "\\bio", i, "a.tif"))
+ }
Error in result[, i] <- readBin(raster@file@con, what = dtype, n = ncols, : replacement has length zero
In addition: Warning message:
In pmatch(origin, c("start", "current", "end")) : closing unused connection 3 (E:\latjam\RTempDir\r_tmp_2018-07-10_074433_1460_37587.gri)
基于阅读writeRaster上的R文档,我想也许我需要将积木另存为多波段栅格,因此我尝试了此操作(但又出现了另一个错误):
writeRaster(r[[1]],filename="bio_a.tif", bandorder="BIL", overwrite=TRUE)
Error in rgdal::putRasterData(x@file@transient, vv, band = i, offset = off) :
Failure during raster IO
然后,我想也许我可以将每个生物变量的两个部分一一合并,然后分别保存,所以我尝试了一下(并得到一个错误):
m.1 <- merge(r[[1]][[1]], r[[2]][[1]], filename=paste0(output.path, "\\bio1.tif"))
Error in rgdal::putRasterData(x@file@transient, v, band = 1, offset = off) :
Failure during raster IO
In addition: Warning messages:
1: closing unused connection 3 (E:\latjam\RTempDir\r_tmp_2018-07-10_074433_1460_37587.gri)
2: closing unused connection 4 (C:/Users/ldugan/Documents/R/bio_a.gri) enter code here
最后,基于我看到的here和here的类似代码,我尝试了一下,但又出现了错误:
outfile <- writeRaster(r[[1]], filename="bio_a.tif", format="GTiff", overwrite=TRUE, options=c("INTERLEAVE=BAND", "COMPRESS=LZW"))
Error in dim(res) <- c(ncols, raster@data@nlayers * nrows) :
dims [product 9852336] do not match the length of object [0]
我感觉到问题的根源可能与像几年前的dismo包一样与潜在的错误有关,或者与磁盘空间有关。即使我设置了光栅选项以将临时文件存储在指定的文件夹中,也有一些文件也存储在我的C驱动器中,并且几乎填满了它。不过,对于什么地方和哪些事情很重要,我有些困惑。第一张图片是我的C驱动器上的temp文件夹,其中R正在存储与此过程相关的文件:
tmpdir()
[1] "C:\\Users\\Me\\AppData\\Local\\Temp\\RtmpU9CJlB"
请注意,“ raster”文件夹中是一个128 GB的文件,其日期会随着我尝试各种操作而不断更新为当前日期(并且其命名约定类似于下图中的那些文件)。 C_drive_temp_folder_tree
这张照片是我在外接驱动器的栅格选项中设置的临时文件夹的。我不确定是否可以删除较早日期的文件(即,仅最后一个文件重要,其余的可以删除以创建空间吗?)我尝试操作时(例如文件),最新文件的日期也会更改在C驱动器上的文件夹中): temp_folder_as_set_in_rasterOptions
因为花费了很长时间,所以我真的想弄清楚如何在不更改.REnviro的tmpdir的情况下从砖中保存图层,因为这需要关闭和打开一个新的会话,我担心将会失去我访问和保存内容的能力(无需再次运行脚本)。我已经将“ r”(包含两个光栅块的列表)另存为.RData文件,并且仍然创建了所有临时文件,因此这可能是非问题并关闭,更改.REnviro文件和重新打开R是解决办法?我觉得我很亲近。数据就在那里。我似乎无法合并和/或保存它们。