वेक्टर को R के साथ तेजी से संसाधित करना


9

मैं वेक्टर को R में रेखापुंज में परिवर्तित कर रहा हूं। हालांकि यह प्रक्रिया बहुत लंबी थी। क्या इसे और अधिक तेज़ी से करने के लिए स्क्रिप्ट को मल्टीथ्रेड या जीपीयू प्रोसेसिंग में डालने की संभावना है?

मेरी स्क्रिप्ट रेखापुंज वेक्टर के लिए।

r.raster = raster()
extent(r.raster) = extent(setor) #definindo o extent do raster
res(r.raster) = 10 #definindo o tamanho do pixel
setor.r = rasterize(setor, r.raster, 'dens_imov')

r.raster

वर्ग: रेखापुंज आयाम: 9636, 11476, 110582736 (nrow, ncol, ncell) संकल्प: 10, 10 (x, y) सीमा: 505755, 620515, 8555432, 8655492 (xmin, xmax, ymin, ymax) समन्वय। संदर्भ। : + proj = longlat + datum = WGS84 + ellps = WGS84 + Towgs84 = 0,0,0

setor

वर्ग: SpatialPolygonsDataFrame विशेषताएं: 5419 सीमा: 505755, 620515.4, 8555429, 8651792 (xmin, xmax, ymin, ymax) समन्वय। संदर्भ। : + proj = utm + क्षेत्र = 24 + दक्षिण + दीर्घवृत्त = GRS80 + इकाइयाँ = m + no_defs चर: 6 नाम: ID, CD_GEOCODI, TIPO, dens_imov, aream, domicilios1 न्यूनतम मान: 35464, 290110605000001, RURAL, 0.002993 1.0000 अधिकतम मान: 58468, 293320820000042, URBANO, 0.54581673,99996, 99.0000

सेटर का प्रिंट यहाँ छवि विवरण दर्ज करें


क्या आप सेटर और r.raster के सारांश पोस्ट कर सकते हैं? मैं कुछ वस्तुओं के सेटटर और r.raster के आयामों के बारे में जानना चाहता हूं। बस उन्हें प्रिंट ठीक है
mdsumner

मैंने प्रश्न के शरीर में सारांश रखा।
14

सारांश नहीं, बस प्रिंट करें - मैंने जो जानकारी मांगी थी वह हमारे लिए नहीं थी
mdsumner

क्षमा करें, मैंने प्रिंट डाल दिया है।
डिओगो कैरिबे

आह, निराश मैं इस बारे में तब तक नहीं सोचता जब तक मैंने प्रिंट-आउट को नहीं देखा - सुनिश्चित करें कि रैस्टर का प्रोजेक्शन पॉलीगॉन से मेल खाता है, यह फिलहाल नहीं है - आर की कोशिश करें - रैस्टर (सेटर); res (r) <- 10; setor.r = rasterize (सेटोर, आर, 'dens_imov') - लेकिन यह भी कोशिश करें, सेटिंग Res (r) <- 250 पहले तो आपको इस बात का अंदाजा हो जाता है कि हाई-रेस संस्करण को कितना समय लगेगा
mdsumal

जवाबों:


17

मैंने इस तरह से पैकेज का उपयोग करके फ़ंक्शन को "समानांतर" करने की कोशिश की :rasterizeRparallel

  1. विभाजित SpatialPolygonsDataFrame में वस्तु nभागों
  2. rasterize हर भाग अलग से
  3. सभी भागों को एक रेखापुंज में मिला दें

मेरे कंप्यूटर में, समानांतर rasterizeफ़ंक्शन को बिना समानांतर फ़ंक्शन के 2.75 गुना कम लिया गया rasterize

नोट: नीचे दिया गया कोड वेब से बहुभुज आकार का (~ 26.2 एमबी) डाउनलोड करता है। आप किसी भी SpatialPolygonDataFrame ऑब्जेक्ट का उपयोग कर सकते हैं। यह केवल एक उदाहरण है।

पुस्तकालयों और उदाहरण डेटा लोड करें:

# Load libraries
library('raster')
library('rgdal')

# Load a SpatialPolygonsDataFrame example
# Load Brazil administrative level 2 shapefile
BRA_adm2 <- raster::getData(country = "BRA", level = 2)

# Convert NAMES level 2 to factor 
BRA_adm2$NAME_2 <- as.factor(BRA_adm2$NAME_2)

# Plot BRA_adm2
plot(BRA_adm2)
box()

# Define RasterLayer object
r.raster <- raster()

# Define raster extent
extent(r.raster) <- extent(BRA_adm2)

# Define pixel size
res(r.raster) <- 0.1

BrazilSPDF

चित्र 1: ब्राज़ील स्पैटियलपॉलीगन्सडॉटाफ्रेम प्लॉट

सरल धागा उदाहरण

# Simple thread -----------------------------------------------------------

# Rasterize
system.time(BRA_adm2.r <- rasterize(BRA_adm2, r.raster, 'NAME_2'))

मेरे लैपटॉप में समय:

# Output:
# user  system elapsed 
# 23.883    0.010   23.891

बहु धागा सूत्र

# Multithread -------------------------------------------------------------

# Load 'parallel' package for support Parallel computation in R
library('parallel')

# Calculate the number of cores
no_cores <- detectCores() - 1

# Number of polygons features in SPDF
features <- 1:nrow(BRA_adm2[,])

# Split features in n parts
n <- 50
parts <- split(features, cut(features, n))

# Initiate cluster (after loading all the necessary object to R environment: BRA_adm2, parts, r.raster, n)
cl <- makeCluster(no_cores, type = "FORK")
print(cl)

# Parallelize rasterize function
system.time(rParts <- parLapply(cl = cl, X = 1:n, fun = function(x) rasterize(BRA_adm2[parts[[x]],], r.raster, 'NAME_2')))

# Finish
stopCluster(cl)

# Merge all raster parts
rMerge <- do.call(merge, rParts)

# Plot raster
plot(rMerge)

BrazilRaster

चित्र 2: ब्राजील रैस्टर प्लॉट

मेरे लैपटॉप में समय:

# Output:
# user  system elapsed 
# 0.203   0.033   8.688 

आर में समानांतरकरण के बारे में अधिक जानकारी :


बहुत अच्छा जवाब!
दिओगो कैरिबे

क्या आप मशीन पर कोर की संख्या के रूप में n सेट नहीं करते हैं?
सैम

@ मुझे लगता है कि यह समस्या के बिना काम करना चाहिए, लेकिन मुझे नहीं पता कि यह बेहतर है या नहीं! मैंने मान लिया कि अगर मैंने कोर की संख्या के बराबर एन भागों में सुविधाओं को विभाजित किया तो शायद इस एक हिस्से को संसाधित करना आसान हो सकता है और कोर जो इसे संसाधित करता है वह बिना उपयोग के होगा! हालाँकि, जब आपके पास कोर से अधिक भाग होते हैं, जब एक कोर एक भाग को संसाधित करता है तो यह अन्य भाग लेता है। लेकिन निश्चित रूप से, मुझे यकीन नहीं है! इस मुद्दे पर किसी भी मदद की सराहना की जाएगी।
गुज्जन

मैं आज रात कुछ परीक्षण चलाने जा रहा हूँ। एक छोटे आकार की आकृति पर (25km तक 25 किमी), 50 मीटर की दूरी पर, n = 2,4 या 8 के साथ n = 20, 30 या 50 तक का उपयोग करने में एक छोटा सा सुधार है। मैं आज रात एक बहुत बड़े आकार में बनाऊंगा और 25 मी। सिंगल कोर प्रोसेसिंग 10hrs है, इसलिए हम देखेंगे कि n के विभिन्न मूल्य क्या हैं !! (n = 50 सिर्फ 1 घंटा से कम है)
सैम

@ Guzmán मैं कोड फिर से चला रहा हूँ। हालाँकि, इसने कुछ त्रुटि को वापस ले लिया और पता नहीं क्यों। क्या आप मेरी मदद कर सकते हैं? CheckForRemoteErrors (वैल) में त्रुटि: 7 नोड्स ने त्रुटियों का उत्पादन किया; पहली त्रुटि: ऑब्जेक्ट 'BRA_adm2' नहीं मिला
डियोगो कारिबे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.