Мне нужно сгладить большой временной ряд, и я использую функцию movingFun из пакета 'растр'.Я протестировал несколько вариантов на основе предыдущих сообщений (см. Мои варианты ниже).Первые 2 работают, но работают очень медленно при использовании реальных данных (все временные ряды MOD13Q1 для всей Австралии).Поэтому я попытался вариант 3 и потерпел неудачу.Я был бы признателен, если бы кто-то мог помочь указать, что не так в этой функции.У меня есть доступ к памяти, я использую сервер RStudio Server с оперативной памятью 700 ГБ, но я не уверен, что будет лучшим подходом для выполнения этой работы.Заранее спасибо.
a) с помощью movingFun и overlay
library(raster)
r <- raster(ncol=10, nrow=10)
r[] <- runif(ncell(r))
s <- brick(r,r*r,r+2,r^5,r*3,r*5)
ptm <- proc.time()
v <- overlay(s, fun=function(x) movingFun(x, fun=mean, n=3, na.rm=TRUE, circular=TRUE)) #works
proc.time() - ptm
user system elapsed
0.140 0.016 0.982
b) с созданием функции и с использованием clusterR.Я думал, что это будет быстрее, чем (а).
fun1 = function(x) {overlay(x, fun=function(x) movingFun(x, fun=mean, n=6, na.rm=TRUE, circular=TRUE))}
beginCluster(4)
ptm <- proc.time()
v = clusterR(s, fun1, progress = "text")
proc.time() - ptm
endCluster()
user system elapsed
0.124 0.012 4.069
в) Я нашел этот документ , написанный Робертом Дж. Хеймансом, и я попытался (и не смог) написать функцию какописано в виньетках.Я не могу полностью выполнить все шаги в этой функции, поэтому терпит неудачу.
smooth.fun <- function(x, filename='', smooth_n ='',...) { #x could be a stack or list of rasters
out <- brick(x)
big <- ! canProcessInMemory(out, 3)
filename <- trim(filename)
if (big & filename == '') {
filename <- rasterTmpFile()
}
if (filename != '') {
out <- writeStart(out, filename, ...)
todisk <- TRUE
} else {
vv <- matrix(ncol=nrow(out), nrow=ncol(out))
todisk <- FALSE
}
bs <- blockSize(out)
pb <- pbCreate(bs$n)
if (todisk) {
for (i in 1:bs$n) {
v <- getValues(out, row=bs$row[i], nrows=bs$nrows[i] )
v <- movingFun(v, fun=mean, n=smooth_n, na.rm=TRUE, circular=TRUE)
out <- writeValues(out, v, bs$row[i])
pbStep(pb, i)
}
out <- writeStop(out)
} else {
for (i in 1:bs$n) {
v <- getValues(out, row=bs$row[i], nrows=bs$nrows[i] )
v <- movingFun(v, fun=mean, n=smooth_n, na.rm=TRUE, circular=TRUE)
cols <- bs$row[i]:(bs$row[i]+bs$nrows[i]-1)
vv[,cols] <- matrix(v, nrow=out@ncols)
pbStep(pb, i)
}
out <- setValues(out, as.vector(vv))
}
pbClose(pb)
return(out)
}
s <- smooth.fun(s, filename='test.tif', smooth_n = 6, format='GTiff', overwrite=TRUE)
Error in .local(.Object, ...) :
`/path-to-dir/test.tif' does not exist in the file system,
and is not recognised as a supported dataset name.