আমি কয়েক হাজার বহুভুজ সীমানার ভিত্তিতে একটি রাস্টার থেকে অঞ্চল এবং বিভিন্ন জমি ব্যবহারের প্রকারের শতাংশ কভারটি বের করছি। আমি খুঁজে পেয়েছি যে প্রত্যক্ষ ফাংশনটি আরও দ্রুত কাজ করে যদি আমি প্রতিটি স্বতন্ত্র বহুভুজ এবং ফসলের মধ্য দিয়ে পুনরাবৃত্তি করি তবে রাস্টারটিকে নির্দিষ্ট বহুভুজের আকারে নিচে মুখোশ দিন। যাইহোক, এটি বেশ ধীর এবং আমি ভাবছি যে আমার কোডটির দক্ষতা এবং গতি উন্নত করার জন্য কারও কাছে কোনও পরামর্শ আছে কিনা।
আমি শুধু এই সংক্রান্ত পেয়েছি কোনদিন এই প্রতিক্রিয়া যারা ব্যবহার প্রস্তাবিত রজার 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
সমান্তরাল প্রক্রিয়াকরণ
সমান্তরাল প্রক্রিয়াকরণ ব্যবহারকারীর সময়কে অর্ধেক করে কেটে ফেলেছে, তবে সিস্টেমের সময় দ্বিগুণ করে সুবিধা উপেক্ষা করেছে। রাস্টার এটি এক্সট্রাক্ট ফাংশনের জন্য ব্যবহার করে তবে দুর্ভাগ্যক্রমে ক্রপ বা মাস্ক ফাংশনের জন্য নয়। দুর্ভাগ্যক্রমে, "আইও" দ্বারা "অপেক্ষা করার " কারণে এটি মোট অতিবাহিত সময়ের চেয়ে অল্প পরিমাণে ছেড়ে যায় leaves
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