2016-12-14 9 views
0

Мне нужно прочитать большое количество .asc-файлов, удалить строки и преобразовать их в растровый стек на stack(). Источник zip-упакованных данных находится здесь: ftp://ftp.dwd.de/pub/CDC/grids_germany/monthly/radiation_global/ Я уже распаковал файлы. Но теперь я написал код, который очень медленно, мой компьютер не может осуществить это:Прочтите большое количество .asc-файлов, удалите строки и сохраните их как растровые в R

files <- list.files("mydirectory", pattern="\\.asc$", 
        full.names=TRUE, recursive=TRUE) 
i <- lapply(files, readLines) #read data 
i <- lapply(i, function(x){x[-(1:28)]}) #delete rows 
i <- lapply(i, function(x){gsub('-999', ' NA ', x, fixed = TRUE)}) #convert '-999' to NA 
i <- lapply(i, function(x){scan(textConnection(x), what = double(), n = 866*654)}) #convert to numeric 
i <- lapply(i, function(x){matrix(x, nrow = 866, ncol = 654, byrow = TRUE)}) #convert to matrix 
r <- lapply(i, function(x){raster(x)}) #rasterize data 
st <- stack(r) #convert to stack-raster 

Интересно, если есть лучший способ, чтобы преобразовать эти данные в растровые файлы. Другие файлы .asc имеют только 6 строк в виде заголовка, как здесь: ftp://ftp.dwd.de/pub/CDC/grids_germany/monthly/precipitation/01_Jan/. Я читал, что данные по более простой функции, которые используют только stack() -функции:

loadRaster <- function(directory, output, clipping){ 
    files <- list.files(path=directory, pattern="\\.asc$", 
        full.names=TRUE, recursive=TRUE) 
    stc <- stack(files) 
    crs(stc) <- gk3 
    stcC <- crop(stc, extent(clipping)) 
    writeRaster(stcC, filename=output) 
} 
#You can ignore the code below "stc <-stack(files)" 
+0

Вы говорите, что это медленно, но где узкое место? Добавьте 'system.time()' ко всему вашему 'lapply', чтобы увидеть проблемный. Это поможет нам указать нашу помощь. Кроме того, lapply часто может ускоряться, просто распараллеливаясь с 'library (parallel)' и функцией 'parLapply'. это может помочь. – Bastien

ответ

0

Наконец я получил его с помощью textConnection() ступенчато (открытие и закрытие еще раз), потому что - и не было, может быть причиной медлительности - существует предел для открытых соединений.

files <- list.files(path="mydirectory", pattern="\\.asc$", 
        full.names=TRUE, recursive=TRUE) 
i <- lapply(files, readLines) 
i <- lapply(i, function(x){x[-(1:28)]}) 
i <- lapply(i, function(x){gsub('-999', ' NA ', x, fixed = TRUE)}) 
names(i) <- substr(files, 92,97) 
i1 <- lapply(i[1:100], function(x){scan(textConnection(x), what = double(), n = 866*654)}) 
closeAllConnections() 
i2 <- lapply(i[101:200], function(x){scan(textConnection(x), what = double(), n = 866*654)}) 
closeAllConnections() 
i3 <- lapply(i[201:300], function(x){scan(textConnection(x), what = double(), n = 866*654)}) 
closeAllConnections() 
i4 <- lapply(i[301:length(i)], function(x){scan(textConnection(x), what = double(), n = 866*654)}) 
closeAllConnections() 
i <- c(i1, i2, i3, i4) 
m <- lapply(i, function(x){matrix(x, nrow = 866, ncol = 654, byrow = TRUE)}) 
r <- lapply(m, function(x){raster(x)}) 
stc <- stack(r)