수천 개의 다각형 경계를 기반으로 한 래스터에서 다양한 토지 사용 유형의 면적과 백분율을 추출하고 있습니다. 각 개별 다각형을 반복하고 자르기 한 다음 특정 다각형의 크기로 래스터를 마스크하면 추출 기능이 훨씬 빠르게 작동한다는 것을 알았습니다. 그럼에도 불구하고 속도가 느리고 누군가가 내 코드의 효율성과 속도를 개선하기위한 제안이 있는지 궁금합니다.
나는이 관련 찾은 유일한는 이 응답 하여 제안 로저 Bivand에 의하여 GDAL.open()
및 GDAL.close()
뿐만 아니라 getRasterTable()
및 getRasterData()
. 나는 그것들을 살펴 보았지만 과거에는 gdal에 문제가 있었고 그것을 구현하는 방법을 알기에 충분히 알지 못한다.
재현 가능한 예 :
library(maptools) ## For wrld_simpl
library(raster)
## Example SpatialPolygonsDataFrame
data(wrld_simpl) #polygon of world countries
bound <- wrld_simpl[1:25,] #name it this to subset to 25 countries and because my loop is set up with that variable
## Example RasterLayer
c <- raster(nrow=2e3, ncol=2e3, crs=proj4string(wrld_simpl), xmn=-180, xmx=180, ymn=-90, ymx=90)
c[] <- 1:length(c)
#plot, so you can see it
plot(c)
plot(bound, add=TRUE)
지금까지 가장 빠른 방법
result <- data.frame() #empty result dataframe
system.time(
for (i in 1:nrow(bound)) { #this is the number of polygons to iterate through
single <- bound[i,] #selects a single polygon
clip1 <- crop(c, extent(single)) #crops the raster to the extent of the polygon, I do this first because it speeds the mask up
clip2 <- mask(clip1,single) #crops the raster to the polygon boundary
ext<-extract(clip2,single) #extracts data from the raster based on the polygon bound
tab<-lapply(ext,table) #makes a table of the extract output
s<-sum(tab[[1]]) #sums the table for percentage calculation
mat<- as.data.frame(tab)
mat2<- as.data.frame(tab[[1]]/s) #calculates percent
final<-cbind(single@data$NAME,mat,mat2$Freq) #combines into single dataframe
result<-rbind(final,result)
})
user system elapsed
39.39 0.11 39.52
병렬 처리
병렬 처리는 사용자 시간을 절반으로 줄 였지만 시스템 시간을 두 배로 늘려서 이점을 무시했습니다. 래스터는 이것을 추출 기능에 사용하지만 불행히도 자르기 또는 마스크 기능에는 사용하지 않습니다. 불행하게도, 이것은 "IO"에 의한 "대기" 로 인해 총 경과 시간이 상당히 더 많이 남습니다 .
beginCluster( detectCores() -1) #use all but one core
여러 코어에서 코드를 실행하십시오.
user system elapsed
23.31 0.68 42.01
그런 다음 클러스터를 종료하십시오
endCluster()
느린 방법 : 래스터 함수에서 직접 추출을 수행하는 대체 방법은 훨씬 오래 걸리며 원하는 형식으로 데이터를 관리하는 데 확신이 없습니다.
system.time(ext<-extract(c,bound))
user system elapsed
1170.64 14.41 1186.14