Я распараллеливаю некоторый код ГИС. Мне не нужно делать это слишком часто, поэтому извините, если мой код не соответствует передовым методам распараллеливания. Пожалуйста, оставьте отзыв, если он у вас есть. Код принимает транзакции с жильем и находит расстояние до объекта, используя 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К?