मैं कई हजार बहुभुज सीमाओं के आधार पर एक रेखापुंज से विभिन्न भूमि उपयोग प्रकारों के क्षेत्र और प्रतिशत कवर निकाल रहा हूं। मैंने पाया है कि अर्क समारोह बहुत तेजी से काम करता है यदि मैं प्रत्येक व्यक्ति बहुभुज और फसल के माध्यम से पुनरावृति करता हूं, तो विशेष रूप से बहुभुज के आकार के नीचे रेखापुंज को मुखौटा करता है। बहरहाल, यह बहुत धीमा है, और मुझे आश्चर्य हो रहा है कि क्या किसी के पास मेरे कोड की दक्षता और गति में सुधार के लिए कोई सुझाव है।
केवल एक चीज मैं इस से संबंधित पाया है है यह प्रतिक्रिया है जो का उपयोग कर सुझाव दिया रोजर Bivand द्वारा GDAL.open()
और GDAL.close()
साथ ही साथ getRasterTable()
और getRasterData()
। मैंने उन पर गौर किया, लेकिन अतीत में गदगद होने से परेशान थे और इसे लागू करने के तरीके को अच्छी तरह से नहीं जानते।
प्रतिकारक उदाहरण:
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