Більш швидка обробка вектора для растрування за допомогою R


9

Я перетворюю вектор у растр у Р. Однак процес був занадто довгим. Чи є можливість поставити скрипт в обробку багатопотокових чи графічних процесорів, щоб зробити це швидше?

Мій сценарій для растрованих вектор.

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) координата. реф. : + proj = longlat + дата = WGS84 + ellps = WGS84 + towgs84 = 0,0,0

сетор

клас: SpatialPolygonsDataFrame: 5419 ступінь: 505755, 620515.4, 8555429, 8651792 (xmin, xmax, ymin, ymax) координата. реф. : + proj = utm + зона = 24 + південь + ellps = GRS80 + одиниці = m + змінних no_defs: 6 імен: ID, CD_GEOCODI, TIPO, den_imov, area_m, domicilios1 min значення: 35464, 290110605000001, RURAL, 0,00000003,100004, Максимальні значення 1.0000: 58468, 293320820000042, URBANO, 0.54581673,99996, 99,0000

Друк сетору введіть тут опис зображення


Чи можете ви розміщувати резюме setor та r.raster? Я хотів би мати деяке уявлення про кількість об'єктів у сеторі та розміри r.raster. просто надрукувати їх добре
mdsumner

Я розміщую резюме в тілі питання.
Diogo Caribé

Не резюме, просто надрукуйте - інформацію, яку я просив, ми не tgere
mdsumner

Вибачте, я поставив друк.
Diogo Caribé

Ах, розчарований, я не думав про це, поки не побачив роздруківку - переконайтесь, що проекція растра відповідає полігонам, на даний момент це не відбувається - спробуйте r <- растр (сетор); res (r) <- 10; setor.r = rasterize (setor, r, 'den_imov') - але також спробуйте, спочатку встановивши res (r) <- 250, щоб ви отримали уявлення про те, як довго буде тривати версія з високою роздільною
здатністю

Відповіді:


17

Я намагався "паралелізувати" функцію, rasterizeвикористовуючи Rпакет parallelтаким чином:

  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

БразиліяSPDF

Рисунок 1: Сюжет Бразильського просторового полігонуDataFrame

Приклад простого потоку

# 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)

Бразилія

Малюнок 2: Сюжет Бразилії Растра

Час у моєму ноутбуці:

# Output:
# user  system elapsed 
# 0.203   0.033   8.688 

Детальніше про паралелізацію в R :


Дуже гарна відповідь!
Diogo Caribé

Ви не просто задаєте n як кількість ядер на машині?
Сем

@Sam Я думаю, що це має працювати без проблем, але я не знаю, краще це чи ні! Я припускав, що якби я розділив функції на n частин, рівних кількості ядер, можливо, одну з цих частин можна було б простіше обробити, а ядро, яке її обробило, було б без використання! Однак якщо у вас більше деталей, ніж ядер, коли одне ядро ​​закінчує обробку однієї частини, це займе іншу частину. Але звичайно, я не впевнений! Будь-яка допомога з цього питання буде вдячна.
Гузман

Я збираюся сьогодні пройти кілька тестів. На невеликому форм-файлі (приблизно 25 км на 25 км), розсіяному на 50 м, є невелике поліпшення використання n = 2,4 або 8 проти n = 20, 30 або до 50. Я сьогодні вночу дуже велику форму файлів і растрировать до 25м. Обробка однієї ядра становить 10 годин, тому ми побачимо, які різні значення n роблять !! (n = 50 трохи менше 1 години)
Сем

@ Guzmán Я знову запускаю код. Однак це відновило певну помилку і не знаю чому. Можеш допомогти мені? Помилка при checkForRemoteErrors (val): 7 вузлів видали помилки; перша помилка: об’єкт 'BRA_adm2' не знайдено
Diogo Caribé
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.