光栅包采取所有硬盘

时间:2014-08-21 12:28:54

标签: r raster

我正在处理一系列栅格(modis ndvi图像)以计算系列的平均值和偏差。每年一次的系列由23个ndvi.tif图像组成,每个图像为508Mb,因此总计是一个11Gb的大处理。以下是一年的剧本。我必须重复这个问题多年。

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

问题: 该过程累积地写入硬盘驱动器,直到它满了。不知道进程写入HD的位置。我发现的清洁高清的唯一方法就是重新启动。尝试过,没有工作。尝试关闭RStudio,没有工作。我使用R 3.0.2与RStudio 0.98.994与Ubuntu 14.04在4Gb RAM华硕UX31与256Gb高清。在没有重新启动的情况下,每年计算后清理高清的任何想法都将受到欢迎。感谢

5 个答案:

答案 0 :(得分:7)

还有两件事需要考虑。首先,通过组合计算或覆盖函数中的步骤来制作更少的中间文件(这里没有太大的范围,但有一些),这也可以加快计算速度,因为读取和写入磁盘的次数会减少。其次,控制删除特定文件。在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()

或将路径作为变量do:

dirname(rasterTmpFile()) 

要设置路径,请使用

rasterOptions(tmpdir='a path')

答案 1 :(得分:3)

我同样努力,但有一些技巧有帮助。 第一次关闭会获得更多内存。 Ram和HD空间很便宜,并且在处理诸如栅格之类的大型R物体时会产生戏剧性的效果。 其次,在栅格包中使用removeTmpFiles()。您可以设置它删除超过特定小时数的tmp文件。例如removeTmpFiles(0.5)将删除超过30分钟的tmp文件。确保只将文件设置为较长时间。 第三,请使用以下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)

答案 2 :(得分:3)

我找到了另一种方法来管理这个问题,对我来说更好,借鉴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)

答案 3 :(得分:0)

我注意到在RobertH有用的答案中,最后建议的命令有一个额外的“e”。它应该是
     rasterOptions(tmpdir ='a path')

而不是
     rasterOptions(tempdir ='a path')

答案 4 :(得分:0)

也许很明显,但是我发现在此线程中实施建议的另一个技巧是对处理指令的顺序保持谨慎。尽量避免重复执行相同的说明,然后“随后全部清洗”。雾化代码并清洁小块。例如,而不是(从上面):

[...]
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'))

就RAM和驱动器而言,这将需要更少的空间:

[...]
nl <- nlayers(filesetndvi10)
avgndvi10 <- mean(filesetndvi10)

desviondvi10_2 <- overlay(filesetndvi10, avgndvi10, fun=function(x, y) (x - y)^2 , 
filename='over_tmp.grd')
rm(avgndvi10)
file.remove(c('over_tmp.grd', 'over_tmp.gri'))

sdndvi10 <- calc(desviondvi10_2, fun=function(x) sqrt(sum(x) / nl), filename='calc_tmp.grd')
rm(desviondvi10_2)
file.remove(c('calc_tmp.grd', 'calc_tmp.gri'))

cvndvi10  <- overlay(xsdndvi10, avgndvi10, fun=function(x,y) x / y, filename='cvndvi10.grd', overwrite=TRUE)
rm(sdndvi10)
file.remove(c('cvndvi10.grd', 'cvndvi10.gri'))