การประมวลผลเวกเตอร์เป็นแรสเตอร์เร็วขึ้นด้วย R


9

ฉันกำลังแปลงเวกเตอร์เป็นแรสเตอร์ใน R อย่างไรก็ตามกระบวนการนี้ยาวเกินไป มีความเป็นไปได้ไหมที่จะนำสคริปต์ไปใช้ในการประมวลผลแบบมัลติเธรดหรือ GPU เพื่อให้เร็วขึ้น?

สคริปต์ของฉันเป็นเวกเตอร์ที่แรสเตอร์

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

คลาส: RasterLayer ขนาด: 9636, 11476, 110582736 (nrow, ncol, ncell) ความละเอียด: 10, 10 (x, y) ขอบเขต: 505755, 620515, 8555432, 8651792 (xmin, xmax, ymin, ymax) coord อ้าง : + proj = longlat + datum = WGS84 + ellps = WGS84 + towgs84 = 0,0,0

Setor

คลาส: คุณสมบัติ SpatialPolygonsDataFrame: 5419 ขอบเขต: 505755, 620515.4, 8555429, 8651792 (xmin, xmax, ymin, ymax) coord อ้าง : + proj = utm + zone = 24 + south + ellps = GRS80 + units = m + no_defs ตัวแปร: 6 ชื่อ: ID, CD_GEOCODI, TIPO, dens_imov, area_m, domicilios1 ค่านาที: 35464, 290110605000001, เขตชนบท, 0.00000003,100,001, 1.0000 ค่าสูงสุด: 58468, 293320820000042, URBANO, 0.54581673,99996, 99.0000

พิมพ์ของ setor ป้อนคำอธิบายรูปภาพที่นี่


คุณสามารถโพสต์บทสรุปของ setor และ r.raster ได้หรือไม่? ฉันต้องการทราบบางอย่างเกี่ยวกับจำนวนวัตถุใน setor และขนาดของ r.raster เพียงแค่พิมพ์พวกเขาจะปรับ
mdsumner

ฉันใส่บทสรุปไว้ในเนื้อหาของคำถาม
Diogo Caribé

ไม่สรุปเพียงพิมพ์ - ข้อมูลที่ฉันขอให้เราไม่ใช่
mdsumner

ขออภัยฉันพิมพ์
Diogo Caribé

อาผิดหวังฉันไม่คิดอย่างนั้นจนกว่าฉันจะเห็นการพิมพ์ออกมา - ตรวจสอบให้แน่ใจว่าการฉายภาพแรสเตอร์ตรงกับรูปหลายเหลี่ยมมันไม่ได้อยู่ในขณะนี้ - ลองใช้ r <- raster (setor); res (r) <- 10; setor.r = rasterize (setor, r, 'dens_imov') - แต่ลองตั้งค่า res (r) <- 250 ก่อนเพื่อให้คุณได้รับความคิดว่ารุ่นความละเอียดสูงจะใช้เวลา
นานเท่าใด

คำตอบ:


17

ฉันพยายาม"ขนาน"ฟังก์ชั่นการrasterizeใช้Rแพคเกจparallelด้วยวิธีนี้:

  1. แยกวัตถุSpatialPolygonsDataFrame เป็นnส่วน ๆ
  2. rasterize แยกทุกส่วน
  3. รวมชิ้นส่วนทั้งหมดเป็นแรสเตอร์เดียว

ในเครื่องคอมพิวเตอร์ของฉัน parallelized rasterizeฟังก์ชั่นใช้เวลา2.75ครั้งน้อยกว่าไม่มี parallelized rasterizeฟังก์ชั่น

หมายเหตุ:รหัสด้านล่างดาวน์โหลดไฟล์รูปหลายเหลี่ยม (~ 26.2 MB) จากเว็บ คุณสามารถใช้วัตถุ 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:พล็อต Brazil SpatialPolygonsDataFrame ของบราซิล

ตัวอย่างเธรดง่าย ๆ

# 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 

ข้อมูลเพิ่มเติมเกี่ยวกับการขนานใน R :


คำตอบที่ดีมาก!
Diogo Caribé

คุณไม่เพียงตั้งค่า n เป็นจำนวนแกนประมวลผลบนเครื่องหรือไม่?
Sam

@ แซมฉันคิดว่ามันควรจะทำงานได้โดยไม่มีปัญหา แต่ฉันไม่รู้ว่ามันดีกว่านี้หรือเปล่า! ฉันสันนิษฐานว่าถ้าฉันแยกคุณสมบัติในส่วนnเท่ากับจำนวนแกนบางทีหนึ่งในส่วนนี้อาจจะง่ายต่อการประมวลผลและแกนที่ประมวลผลมันจะไม่ใช้! อย่างไรก็ตามหากคุณมีชิ้นส่วนมากกว่าแกนเมื่อแกนประมวลผลหนึ่งส่วนเสร็จสิ้นส่วนหนึ่งจะใช้ส่วนอื่น แต่แน่นอนฉันไม่แน่ใจ! ความช่วยเหลือใด ๆ เกี่ยวกับปัญหานี้จะได้รับการชื่นชม
Guzmán

ฉันจะทำการทดสอบในคืนนี้ ในรูปร่างขนาดเล็ก (ประมาณ 25km โดย 25km), rasterized เป็น 50m มีการปรับปรุงเล็กน้อยในการใช้ n = 2,4 หรือ 8 เทียบกับ n = 20, 30 หรือสูงกว่า 50 ฉันจะย่อยในไฟล์รูปร่างขนาดใหญ่คืนนี้ และ rasterize ถึง 25m การประมวลผลแบบแกนเดียวคือ 10 ชม. ดังนั้นเราจะเห็นค่าต่าง ๆ ของ n ทำ !! (n = 50 ใช้เวลาน้อยกว่า 1 ชั่วโมง)
Sam

@ Guzmánฉันรันรหัสอีกครั้ง อย่างไรก็ตามข้อผิดพลาดบางอย่างกลับคืนมาและไม่ทราบสาเหตุ คุณสามารถช่วยฉันได้ไหม? ข้อผิดพลาดใน checkForRemoteErrors (val): 7 โหนดเกิดข้อผิดพลาด; ข้อผิดพลาดแรก: ไม่พบวัตถุ 'BRA_adm2'
Diogo Caribé
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.