Мне нужно взять 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% выборки. Но я получаю тот же результат.
Буду признателен за помощь в понимании того, почему этот код работает не так, как ожидалось. Спасибо!