我正在处理栅格(modis ndvi图像)的时间序列,以计算该序列的平均值和st.deviation。每个年度系列由23个ndvi.tif图像组成,每个图像大小为508Mb,因此总共需要处理11 to的图像。以下是一年的脚本。我必须在几年内重复这个过程。
library(raster)
library("rgeos")
filesndvi <- list.files(, pattern="NDVI.tif",full.names=TRUE)
filesetndvi10 <- stack(filesndvi)
names(filesetndvi10)
avgndvi10<-mean(filesetndvi10)
desviondvi10 <- filesetndvi10 - avgndvi10
sumdesvioc <-sum(desviondvi10^2)
varndvi10 <- sumdesvioc/nlayers(filesetndvi10)
sdndvi10 <- sqrt(varndvi10)
cvndvi10 <- sdndvi10/avgndvi10问题:这个过程会在硬盘中不断地写入,直到写满为止。不知道进程在硬盘中写入的位置。我找到的清理硬盘的唯一方法就是重启。尝试过rm,但不起作用。尝试关闭RStudio,但不起作用。我使用的是R3.0.2,RStudio 0.98.994,Ubuntu14.04,4 4Gb内存,华硕UX31,256 4Gb硬盘。任何在每年计算后清理HD而无需重启的想法都将非常受欢迎。谢谢
发布于 2014-09-04 02:40:28
还有另外两件事需要考虑。首先,通过组合计算或覆盖函数中的步骤来创建更少的中间文件(这里没有太多的范围,但也有一些),这也可以加快计算速度,因为从磁盘读取和写入磁盘的次数将会减少。其次,控制删除特定的文件。在calc和overlay函数中,您可以提供文件名,以便删除不再需要的文件。但您也可以显式删除临时文件。当然,最好的做法是首先删除指向这些文件的对象。这是一个基于你的例子。
library(raster)
# example data
set.seed(0)
ndvi <- raster(nc=10, nr=10)
n1 <- setValues(ndvi, runif(100) * 2 - 1)
n2 <- setValues(ndvi, runif(100) * 2 - 1)
n3 <- setValues(ndvi, runif(100) * 2 - 1)
n4 <- setValues(ndvi, runif(100) * 2 - 1)
filesetndvi10 <- stack(n1, n2, n3, n4)
nl <- nlayers(filesetndvi10)
avgndvi10 <- mean(filesetndvi10)
desviondvi10_2 <- overlay(filesetndvi10, avgndvi10, fun=function(x, y) (x - y)^2 , filename='over_tmp.grd')
sdndvi10 <- calc(desviondvi10_2, fun=function(x) sqrt(sum(x) / nl), filename='calc_tmp.grd')
cvndvi10 <- overlay(xsdndvi10, avgndvi10, fun=function(x,y) x / y, filename='cvndvi10.grd', overwrite=TRUE)
f <- filename(avgndvi10)
rm(avgndvi10, desviondvi10_2, sdndvi10)
file.remove(c(f, extension(f, '.gri')))
file.remove(c('over_tmp.grd', 'over_tmp.gri', 'calc_tmp.grd', 'calc_tmp.gri'))要查找写入临时文件的位置,请查看
rasterOptions()或者要将路径作为变量获取,请这样做:
dirname(rasterTmpFile()) 要将其设置为路径,请使用
rasterOptions(tmpdir='a path')发布于 2014-08-21 21:07:59
我也在为同样的问题而苦苦挣扎,但有一些技巧可以帮助我。的第一个是获取更多的内存。Ram和HD空间很便宜,在处理像光栅这样的大型R对象时会有很大的效果。其次是,在raster包中使用removeTmpFiles()。您可以将其设置为删除超过特定小时数的临时文件。例如,removeTmpFiles(0.5)将删除超过30分钟的临时文件。请确保仅在文件将不再被调用时设置此选项。第三,,使用下面的rasterOptions()代码片段。设置内存块大小时要小心;这些内存块大小不适用于您的系统,但您可能会发现一些比缺省值更优化的大小。最后,,使用rm()和gc()在你做饭的时候进行清理。希望这对你有帮助,但如果你找到更好的解决方案,请让我知道。
tmpdir_name <- paste(c(drive, ":/RASTER_TEMP/"), collapse='')
if(file.exists(tmpdir_name) == FALSE){
dir.create(tmpdir_name)
}
rasterOptions(datatype = "FLT4S",
progress = "text",
tmpdir = tmpdir_name,
tmptime = 4,
timer = TRUE,
tolerance = 0.5,
chunksize = 1e+08,
maxmemory = 1e+09)发布于 2016-02-06 14:03:20
我找到了另一种方法来处理这个问题,这对我来说更好,那就是利用this answer。在我的例子中,我使用的是并行循环,我不想删除临时目录中的所有文件,因为这可能会删除其他进程的临时文件。
@RobertH的答案建议命名每个单独的临时文件名是好的,但我不确定这是否手动强制光栅写入即使是小文件到硬盘驱动器,而不是使用RAM和减慢进程(光栅文档中说,只有当文件不能放入RAM时才写入磁盘)。
因此,我所做的是从循环或并行进程中创建一个临时目录,该目录与循环中正在处理的数据中的唯一名称相关联,在我的例子中是single@data$OWNER的值
#creates unique filepath for temp directory
dir.create (file.path("c:/",single@data$OWNER), showWarnings = FALSE)
#sets temp directory
rasterOptions(tmpdir=file.path("c:/",single@data$OWNER)) 在这里插入您的处理代码,然后在循环的末尾删除整个文件夹:
#removes entire temp directory without affecting other running processes
unlink(file.path("c:/",single@data$OWNER), recursive = TRUE)https://stackoverflow.com/questions/25426405
复制相似问题