Xử lý vector để raster nhanh hơn với R


9

Tôi đang chuyển đổi vector sang raster trong R. Tuy nhiên quá trình này quá dài. Có khả năng đưa tập lệnh vào xử lý đa luồng hoặc xử lý GPU để thực hiện nhanh hơn không?

Kịch bản của tôi để rasterized vector.

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

lớp: RasterLayer kích thước: 9636, 11476, 110582736 (nrow, ncol, ncell) độ phân giải: 10, 10 (x, y) phạm vi: 505755, 620515, 8555432, 8651792 (xmin, xmax, ymin, ymax). tham chiếu : + proj = longlat + datum = WGS84 + ellps = WGS84 + Towks84 = 0,0,0

người thiết lập

lớp: SpatialPolygonsDataFrame tính năng: 5419 phạm vi: 505755, 620515.4, 8555429, 8651792 (xmin, xmax, ymin, ymax) tọa độ. tham chiếu : + ủng hộ = 1,0000 giá trị tối đa: 58468, 293320820000042, URBANO, 0,54581673,99996, 99.0000

In của setor nhập mô tả hình ảnh ở đây


Bạn có thể đăng tóm tắt của setor và r.raster không? Tôi muốn có một số ý tưởng về số lượng đối tượng trong setor và kích thước của r.raster. chỉ cần in chúng là ổn
mdsumner 6/10/2016

Tôi đặt tóm tắt trong cơ thể của câu hỏi.
Diogo Caribé

Không tóm tắt, chỉ in - thông tin tôi yêu cầu chúng tôi không phải là
mdsumner

Xin lỗi, tôi đặt bản in.
Diogo Caribé

À, thất vọng tôi đã không nghĩ đến điều này cho đến khi tôi thấy bản in ra - hãy chắc chắn rằng hình chiếu của raster phù hợp với đa giác, hiện tại thì không - hãy thử r <- raster (setor); độ phân giải (r) <- 10; setor.r = rasterize (setor, r, 'dens_imov') - nhưng cũng thử, đặt res (r) <- 250 trước để bạn có thể biết phiên bản độ phân giải cao sẽ mất bao lâu
mdsumner

Câu trả lời:


17

Tôi đã cố gắng "song song hóa" chức năng rasterizebằng cách sử dụng Rgói paralleltheo cách này:

  1. chia đối tượng SpatialPolygonsDataFrame thành ncác phần
  2. rasterize mỗi phần riêng biệt
  3. hợp nhất tất cả các bộ phận vào một raster

Trong máy tính của tôi, rasterizechức năng song song mất ít hơn 2,75 lần so với rasterizechức năng không song song .

Lưu ý: mã bên dưới tải xuống một shapefile đa giác (~ 26,2 MB) từ web. Bạn có thể sử dụng bất kỳ đối tượng SpatialPolygonDataFrame. Đây chỉ là một ví dụ.

Tải thư viện và dữ liệu mẫu:

# 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

Hình 1: Sơ đồ SpatialPolygonsDataFrame của Brazil

Ví dụ chủ đề đơn giản

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

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

Thời gian trong máy tính xách tay của tôi:

# Output:
# user  system elapsed 
# 23.883    0.010   23.891

Ví dụ chủ đề đa luồng

# 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

Hình 2: Sơ đồ raster Brazil

Thời gian trong máy tính xách tay của tôi:

# Output:
# user  system elapsed 
# 0.203   0.033   8.688 

Thông tin thêm về song song hóa trong R :


Câu trả lời rất hay!
Diogo Caribé

Bạn không chỉ đặt n là số lõi trên máy?
Sam

@Sam Tôi nghĩ nó nên hoạt động mà không có vấn đề gì nhưng tôi không biết nó có tốt hơn hay không! Tôi giả định rằng nếu tôi chia các tính năng thành n phần bằng số lượng lõi thì có thể một trong những phần này có thể dễ xử lý hơn và lõi đã xử lý nó sẽ không được sử dụng! Tuy nhiên, nếu bạn có nhiều phần hơn lõi khi một lõi hoàn thành xử lý một phần thì nó sẽ lấy phần khác. Nhưng chắc chắn, tôi không chắc! Bất kỳ trợ giúp về vấn đề này sẽ được đánh giá cao.
Guzmán

Tôi sẽ chạy một số thử nghiệm tối nay. Trên một shapefile nhỏ (khoảng 25km x 25km), raster tới 50m, có một sự cải thiện nhỏ trong việc sử dụng n = 2,4 hoặc 8 so với n = 20, 30 hoặc lên tới 50. Tối nay tôi sẽ đăng ký một shapefile rất lớn và rasterize đến 25m. Xử lý lõi đơn là 10 giờ vì vậy chúng ta sẽ thấy các giá trị khác nhau của n làm gì !! (n = 50 chỉ dưới 1 giờ)
Sam

@ Guzmán Tôi lại chạy mã. Tuy nhiên, nó đã khắc phục một số lỗi và không biết tại sao. Bạn có thể giúp tôi được không? Lỗi trong checkForRemoteErrors (val): 7 lỗi tạo ra; lỗi đầu tiên: không tìm thấy đối tượng 'BRA_adm2'
Diogo Caribé
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.