случайная выборка из большого растра с использованием clusterR - PullRequest
0 голосов
/ 01 ноября 2018

Мне нужно взять 5% случайную выборку из очень большого растра и вернуть новый растр. Я пытаюсь использовать sampleRandom из пакета raster, но процесс идет очень медленно (на моей машине только 8 ГБ ОЗУ, 64-битный R). Растр был обрезан / замаскирован, чтобы соответствовать границе области исследования неправильной формы, а также значения NA в прямоугольном экстенте вокруг границы многоугольника и некоторые внутренние значения NA - я пытаюсь выбирать только из значений не-NA , Я пробовал как 5%, так и перевернуть это до 95% - оба работали в течение> 2 часов без результата, после чего я прекратил процесс.

Я пытаюсь ускорить его, запустив его параллельно с помощью команды clusterR, но я новичок как в команде sampleRandom, так и в использовании clusterR. Мой код выполняется, но я возвращаю все пиксели, не относящиеся к NA, поэтому пример не работает. Это проблема с моим кодом или sampleRandom не может работать с clusterR?

Вот описание моего растрового слоя:

conv.mod
class       : RasterLayer 
dimensions  : 23828, 19095, 454995660  (nrow, ncol, ncell)
resolution  : 56, 56  (x, y)
extent      : -1220192, -150872, 87580, 1421948  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=aea +lat_1=44.75 +lat_2=55.75 +lat_0=40 +lon_0=-96 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0 
data source : C:\GIS\carbon_cows\Intact\conv_mod.tif 
names       : conv_mod 
values      : 1, 1  (min, max)

А вот код, который я пробовал:

library(raster)
library(parallel)

tot<-cellStats(conv.mod,'sum', na.rm=TRUE) #get the total pixels in conv.mod
sampsize<-tot * 0.05 #calculate how many pixels would represent 5% 
removeTmpFiles() #clear some memory

numcores<-detectCores() -1

start<-Sys.time()

beginCluster(numcores)
cl<-getCluster()
clusterExport(cl,"sampsize", envir = .GlobalEnv)
conv.perc <- clusterR(conv.mod,sampleRandom,args=list(size=sampsize,na.rm=TRUE,asRaster=TRUE))
endCluster()

end<-Sys.time()
difftime(end,start)

Вот общее количество не-NA ячеек в исходном растровом слое:

tot<-cellStats(conv.mod,'sum', na.rm=TRUE)
tot
105193858

и число, которое должно быть 5% выборки:

sampsize<-tot * 0.05
sampsize
5259693

Но полученный результирующий растр имеет то же количество пикселей, чем NA, что и исходный растр:

tot_convperc<-cellStats(conv.perc,'sum',na.rm=T)
tot_convperc
105193858

Я также попытался изменить расчет размера выборки и запустить sampleRandom, так что я запрашиваю 95% выборки. Но я получаю тот же результат.

Буду признателен за помощь в понимании того, почему этот код работает не так, как ожидалось. Спасибо!

1 Ответ

0 голосов
/ 02 ноября 2018

Неважно. Я смог воспользоваться этим сообщением: https://gis.stackexchange.com/questions/17255/random-sampling-of-raster-using-r и ответом whuber.

Следующий код решил мою проблему без использования кластера:

col.conv <- ncol(conv.mod)
row.conv<-nrow(conv.mod)
r<-conv.mod
start<-Sys.time()
r[runif(col.conv*row.conv) >= 0.95] <- NA # Randomly *unselect* 5% of the data

end<-Sys.time()
difftime(end,start)

Этот код выполнялся за ~ 3 минуты, а не более часа, чтобы ввести код simpleRandom в команду clusterR. Я все еще удивляюсь, почему simpleRandom на самом деле не брал образец, а также почему этот новый код намного эффективнее, но счастлив, что проблема решена.

...