【发布时间】:2021-10-18 22:48:56
【问题描述】:
我需要对栅格堆栈执行 kmeans 分析,但它是一个非常大的文件 - 目前超过 100 GB,因此程序将返回“无法分配”错误。
在不过多更改数据的情况下,将堆栈大小减小到某个点以下的最佳方法是什么?我可以尝试“重新采样”,但如果我想将其保持在 1GB 以下,我担心从 100GB 开始会丢失太多信息,而且我也不知道重新采样的“多少”。
编辑:也尝试了“memory.limit(size)”技巧,但无济于事。
【问题讨论】:
我需要对栅格堆栈执行 kmeans 分析,但它是一个非常大的文件 - 目前超过 100 GB,因此程序将返回“无法分配”错误。
在不过多更改数据的情况下,将堆栈大小减小到某个点以下的最佳方法是什么?我可以尝试“重新采样”,但如果我想将其保持在 1GB 以下,我担心从 100GB 开始会丢失太多信息,而且我也不知道重新采样的“多少”。
编辑:也尝试了“memory.limit(size)”技巧,但无济于事。
【问题讨论】:
您是否尝试将栅格划分为图块?您可以这样做,然后运行一个循环,在该循环中分别分析每个图块并将每个图块保存在列表中。我做了类似的事情,例如:
library("sf")
r = stack(file.path(wdir,"your_raster"))
crs(r) <- CRS(paste0("+init=epsg:",projectCRS))
tilegrid = st_as_sf(as(raster::extent(r), "SpatialPolygons"))
tilegrid = st_as_sf(st_make_grid(tilegrid, cellsize = 5000))
单元格大小由您决定,然后创建列表并开始循环
raster.list = list()
for(i in 1:nrow(tilegrid) ){
ss = tilegrid[i,]
ss = st_buffer(ss, 25, joinStyle="MITRE", endCapStyle = "FLAT") # da
r.crop = crop(r, ss)[[1]]
您在此处对 r.crop 运行分析,并在循环结束时添加 最终栅格(r.final)到列表并关闭循环
raster.list[[i]] = r.final
}
这样做您应该使用较低的数据负载,如果您需要一个唯一的栅格作为最终结果,使用马赛克功能就足够了,我这样做了:
raster.list$fun = mean
raster.list$na.rm = TRUE
final.raster = do.call(raster::mosaic, raster.list)
【讨论】: