2016-12-14 11 views
0

多数の.asc-filesを読み込み、行を削除し、ラスタースタックに変換する必要があります。stack()。 ZIPで圧縮されたデータのソースは、ここにあります:ftp://ftp.dwd.de/pub/CDC/grids_germany/monthly/radiation_global/ 私はすでにファイルを解凍しました。しかし、今、私は本当に遅いです。このコードを書いた、私のコンピュータはそれを達成することはできません。大量の.ascファイルを読み込み、行を削除してラスターとして保存します。

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/。 - 遅さの原因は多分あったとするので

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

ボトルネックはどこが遅いですか?すべての 'lapply'呼び出しに' system.time() 'を加えて、問題のあるものを見てください。それは、私たちの助けを差し伸べるのに役立ちます。また、lapplyは 'library(parallel)'と 'parLapply'関数との並列化を高速化することができます。それは助けるかもしれません。 – Bastien

答えて

0

最後に、私は、textConnection()段階的に(開口部と、再びクローズ)を使用して、それを得た - :私はstack() -functionを使用はるかに単純な機能によるデータのことを読みます開いている接続には制限があります。

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) 
関連する問題