foreach возвращает пустой фрейм данных при параллельной работе - PullRequest
0 голосов
/ 03 апреля 2019

Работа на 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 
...