2017-02-21 8 views
1

Я работаю с большим набором данных, и я пытаюсь запустить геопространственный анализ на локальной машине с 8 ГБ оперативной памяти. Похоже, я превысил ресурсы своей машины, и мне интересно, могу ли я оптимизировать свою модель, чтобы я мог запускать ее на своей машине.Оптимизация расстояния distHaversine модель для больших df в R

area <- data.frame(area = c('Baker Street','Bank'), 
        lat = c(51.522236,51.5134047), 
        lng = c(-0.157080, -0.08905843), 
        radius = c(100,2000) 
) 

stop <- data.frame(station = c('Angel','Barbican','Barons Court','Bayswater'), 
        lat = c(51.53253,51.520865,51.490281,51.51224), 
        lng = c(-0.10579,-0.097758,-0.214340,-0.187569), 
        postcode = c('EC1V','EC1A', 'W14', 'W2')) 



library(geosphere) 


datNew = lapply(1:nrow(area), function(i) { 

    df = stop 

    df$dist = distHaversine(df[,c("lng", "lat")], 
          area[rep(i,nrow(df)), c('lng','lat')]) 

    df$in_circle = ifelse(df$dist <= area[i, "radius"], "Yes", "No") 

    df$circle_id = area[i, "area"] 

    df 

}) 

datNew = do.call(rbind, datNew) 

require(dplyr)  
datNew <- datNew %>% 
    group_by(station) %>% 
    slice(which.min(dist)) 

Можно вычислить расстояние, а затем найти минимальное расстояние в station по station, так что я не в конечном итоге с умножением числа stations по количеству area? Или есть другое решение, которое позволило бы мне запустить это менее ресурсоемким способом или разделить задания, чтобы он вписывался в ОЗУ?

ответ

1

Вы пытались поставить gc() в конце функции lapply? Он освобождает пространство памяти для следующей итерации. Если это не помогает больной попытаться вернуться к этому ответ Завтра, просто ответьте :)

EDIT:

я не знаю, если вы это имели в виду, но здесь вы идете:

library(geosphere) 
library("plyr") 
library("magrittr") 

area <- data.frame(area = c('Baker Street','Bank'), 
        lat = c(51.522236,51.5134047), 
        lng = c(-0.157080, -0.08905843), 
        radius = c(100,2000) 
) 

stop <- data.frame(station = c('Angel','Barbican','Barons Court','Bayswater'), 
        lat = c(51.53253,51.520865,51.490281,51.51224), 
        lng = c(-0.10579,-0.097758,-0.214340,-0.187569), 
        postcode = c('EC1V','EC1A', 'W14', 'W2')) 

## In the function below you take an area one by one and then save the station which at the minimal 
## distance from the given area 

min.dist <- ddply(area, ~area, function(xframe){ 

    xframe <<- xframe 
    cat("Calculating minimum distance from area...", as.character(xframe$area), "\n") 

    dists <- distHaversine(xframe[, c("lat", "lng")], stop[ , c("lat", "lng")]) 
    stop.min <- stop[which(min(dists)==dists), ] 
    stop.min$area <- xframe$area 
    return(stop.min) 
    gc() 

}) 

min.dist # the new data frame 
+0

Проблема, которую я имею в том, что 'df', созданный функцией, слишком велик, чтобы затем группировать, поэтому я хотел бы сделать что-то, где я вычислил расстояние до каждой точки и найти минимальное расстояние по точкам, чтобы я не создавайте большой 'df', который я не могу обработать впоследствии, если это имеет смысл. Или, может быть, есть еще лучшее решение, о котором я не думал? – Davis

+0

Работал как очарование. Спасибо за помощь! – Davis

Смежные вопросы