Работа на R (Windows 10, 32 ГБ оперативной памяти) Я бегу статистики зональной области по квадратной сетке с интервалом 100 метров и двоичное изображение с размером пикселя 20м. Я хочу знать, сколько растровых ячеек пересекают каждую мою квадратную сетку. Моя цель - получить часть ячейки, которая покрыта растровым изображением.
В моем коде я использую пакет Velox после тестирования того, что работает быстрее для моего подхода. Это хорошо работает, когда я запускаю код с использованием% do%, но когда я распараллеливаю код (% dopar%), фрейм данных результатов становится пустым.
Я пытался много комбинаций параметров, но по какой-то причине функция параллельного подхода не работает. Только когда я пробую одноядерный подход, фрейм данных результатов будет иметь выход. При работе с verbose = T я получаю, что каждая задача выполняется, но слияние не удается. Это наводит меня на мысль, что rbind пытается объединить фреймы данных разных структур. Однако мой фрейм данных очень прост, всего один столбец, так что в этом нет ничего плохого, и, как я уже сказал, с одним ядром результаты согласуются.
area_fraction= function(j){
raster_binary_velox1=raster_binary_velox$copy() #a binary raster at 20 m cell size
single_cell= cells_intersect1[j,1] #identify the cell point in current loop
spols1 <- st_buffer(x=single_cell, dist=50,endCapStyle='SQUARE') #convert cell point to polygons squares of 100m
raster_binary_velox1$crop(spols1) #crop the raster to the extent of the cell spols1
stats=raster_binary_velox1$extract(sp=spols1, df=T, small=T, fun=function(x){sum(x, na.rm=TRUE)}) #extract the explicit values of the raster
spols1$cell= stats$out
st_geometry(spols1) <- NULL #set geometry to null
output=as.data.frame(spols1)
return(output)
}
results=data.frame()
# Registering clusters
cl <- parallel::makeCluster(2) #number of cpu logical processors
doParallel::registerDoParallel(cl)
start_time <- Sys.time()
results=foreach(j=1:1000, .errorhandling = 'remove', .combine = rbind, .verbose=T) %do% {
area_fraction(j)
}
str(results)
end_time <- Sys.time()
end_time - start_time
Я бы очень хотел запустить это параллельно, так как с одним ядром процесс может занять несколько часов.
Фрейм выходных данных в одном процессе выглядит следующим образом
'data.frame' 170961 obs. of 2 variables
$cidh: int 10247748 10247758 10247759
#cell: int 11 16 13 13 22