Почему параллельное gDistance добавляет наблюдения в последнюю итерацию? (Р, ГИС) - PullRequest
0 голосов
/ 18 марта 2020

Я распараллеливаю некоторый код ГИС. Мне не нужно делать это слишком часто, поэтому извините, если мой код не соответствует передовым методам распараллеливания. Пожалуйста, оставьте отзыв, если он у вас есть. Код принимает транзакции с жильем и находит расстояние до объекта, используя rgeos::gDistance(). Он работает, пока не достигнет последней итерации или порции данных. Каждый второй кусок был около 1К наблюдений. Последняя итерация имеет только 299 наблюдений. Когда параллельный код попадает в этот фрагмент, он повторяет результат первых 299 наблюдений, чтобы заполнить последние 701 наблюдений. Последняя итерация становится solid 1K. Возвращенные результаты расстояния верны, но мне более любопытно, ПОЧЕМУ это произойдет. Я подозреваю, что это не будет моим последним родео с распараллеленным кодом и хотел бы улучшить мои знания. Код ниже.

# Read in data 
data <- read.csv(file.path.target)
# Polygons
shapefile <- readOGR(file.path.join)

# Grab unique ID and house coordinates for SPDF
data$apnunformatted <- as.character(data$apnunformatted)
coords <- cbind(data$xcoord, data$ycoord)
data.forspdf <- as.data.frame(data$apnunformatted)

# create chunk ID ..
# every 1000 obs is a new chunk
# 224 total chunks
for(i in 1:224){
  x <- ((i-1)*1000)+1
  y <- ((i)*1000)
  data.forspdf[x:y,2] <- i
  print(paste(x, y, sep = ";"))

}

# remove added observations
data.forspdf <- subset(data.forspdf, is.na(data.forspdf[,1])==F)

# Create a shapefile of points containing the unique ID and chunk ID
spdf <- SpatialPointsDataFrame(coords = coords, data = data.forspdf,
                               proj4string = CRS("+proj=longlat +datum=WGS84"))
spdf <- spTransform(spdf, crs(shapefile))

### Begin parallel ###
lr <- as.numeric(nrow(data.forspdf))
last.it <- as.numeric(data.forspdf[lr,2])

numCores <- detectCores()
registerDoParallel(numCores)

system.time({
  results <- foreach(i=1:last.it, .combine=rbind, .packages="rgeos") %dopar% {
    # subset chunks
    go <- subset(spdf, spdf@data$V2 == i)
    # Recover distance matrix
    d <- gDistance(spgeom1 = go, spgeom2 = shapefile, byid=TRUE)
    # Use only the closest distance
    a <- apply(d, 2, min)
  }
})
stopImplicitCluster()

### Stop parallel

# Merge distance results back on 
merge.back <- as.data.frame(matrix(0,0,3))
for(i in 1:as.numeric(last.it)){
  match <- results[i,]
  match2 <- subset(data.forspdf, data.forspdf$V2==i)
  matched <- cbind(match2, match)
  merge.back <- rbind(merge.back, matched)
}

К сожалению, данные являются собственностью, поэтому я не могу опубликовать пример. Я попытался описать типы файлов в комментариях к коду. Когда я использую gDistance вне параллели l oop, он возвращает только 299 объектов. Так почему же %dopar% вернет 1К?

...