首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >栅格包包含所有硬盘驱动器

问栅格包包含所有硬盘驱动器
EN

Stack Overflow用户
提问于 2014-08-21 20:28:54
回答 5查看 6.6K关注 0票数 11

我正在处理栅格(modis ndvi图像)的时间序列,以计算该序列的平均值和st.deviation。每个年度系列由23个ndvi.tif图像组成,每个图像大小为508Mb,因此总共需要处理11 to的图像。以下是一年的脚本。我必须在几年内重复这个过程。

代码语言:javascript
复制
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而无需重启的想法都将非常受欢迎。谢谢

EN

回答 5

Stack Overflow用户

发布于 2014-09-04 02:40:28

还有另外两件事需要考虑。首先,通过组合计算或覆盖函数中的步骤来创建更少的中间文件(这里没有太多的范围,但也有一些),这也可以加快计算速度,因为从磁盘读取和写入磁盘的次数将会减少。其次,控制删除特定的文件。在calc和overlay函数中,您可以提供文件名,以便删除不再需要的文件。但您也可以显式删除临时文件。当然,最好的做法是首先删除指向这些文件的对象。这是一个基于你的例子。

代码语言:javascript
复制
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'))

要查找写入临时文件的位置,请查看

代码语言:javascript
复制
rasterOptions()

或者要将路径作为变量获取,请这样做:

代码语言:javascript
复制
dirname(rasterTmpFile()) 

要将其设置为路径,请使用

代码语言:javascript
复制
rasterOptions(tmpdir='a path')
票数 14
EN

Stack Overflow用户

发布于 2014-08-21 21:07:59

我也在为同样的问题而苦苦挣扎,但有一些技巧可以帮助我。的第一个是获取更多的内存。Ram和HD空间很便宜,在处理像光栅这样的大型R对象时会有很大的效果。其次是,在raster包中使用removeTmpFiles()。您可以将其设置为删除超过特定小时数的临时文件。例如,removeTmpFiles(0.5)将删除超过30分钟的临时文件。请确保仅在文件将不再被调用时设置此选项。第三,,使用下面的rasterOptions()代码片段。设置内存块大小时要小心;这些内存块大小不适用于您的系统,但您可能会发现一些比缺省值更优化的大小。最后,,使用rm()和gc()在你做饭的时候进行清理。希望这对你有帮助,但如果你找到更好的解决方案,请让我知道。

代码语言:javascript
复制
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)
票数 5
EN

Stack Overflow用户

发布于 2016-02-06 14:03:20

我找到了另一种方法来处理这个问题,这对我来说更好,那就是利用this answer。在我的例子中,我使用的是并行循环,我不想删除临时目录中的所有文件,因为这可能会删除其他进程的临时文件。

@RobertH的答案建议命名每个单独的临时文件名是好的,但我不确定这是否手动强制光栅写入即使是小文件到硬盘驱动器,而不是使用RAM和减慢进程(光栅文档中说,只有当文件不能放入RAM时才写入磁盘)。

因此,我所做的是从循环或并行进程中创建一个临时目录,该目录与循环中正在处理的数据中的唯一名称相关联,在我的例子中是single@data$OWNER的值

代码语言:javascript
复制
#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)) 

在这里插入您的处理代码,然后在循环的末尾删除整个文件夹:

代码语言:javascript
复制
#removes entire temp directory without affecting other running processes
unlink(file.path("c:/",single@data$OWNER), recursive = TRUE)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25426405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档