2017-02-21 2 views
1

Ich arbeite mit einem großen Datensatz und ich versuche, Geospatial-Analyse auf einem lokalen Computer mit 8 GB RAM auszuführen. Es sieht so aus, als ob ich die Ressourcen meiner Maschine überschritten habe und ich frage mich, ob ich mein Modell optimieren kann, damit ich es auf meinem Rechner ausführen kann.Optimierungsabstand distHaversine Modell für große df in 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)) 

Ist es möglich, den Abstand zu berechnen und dann den Mindestabstand in station von station finden, so dass ich mit Multiplikation der die Anzahl der stations nach Anzahl der area am Ende nicht? Oder gibt es eine andere Lösung, die es mir erlaubt, dies auf eine weniger ressourcenintensive Art und Weise auszuführen oder die Jobs so aufzuteilen, dass sie in den Arbeitsspeicher passen?

Antwort

1

Haben Sie versucht, gc() am Ende der Lapply-Funktion zu setzen? Es gibt den Speicherplatz für die nächste Iteration frei. Ist dies nicht krank hilft versuchen, wieder zu dieser Antwort tommorow zu kommen, antworten Sie einfach bitte :)

EDIT:

Ich weiß nicht, wenn Sie dies im Sinn hatte, aber hier geht:

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

Das Problem, das ich habe, ist, dass das 'df', das die Funktion erstellt, zu groß ist, um dann die Gruppierung zu machen, also würde ich gerne etwas tun, wo ich die Entfernung zu jedem Punkt berechnen und die minimale Entfernung Punkt für Punkt finden würde Erstelle nicht das große 'df', das ich später nicht verarbeiten kann, wenn das Sinn macht. Oder gibt es eine noch bessere Lösung, an die ich nicht gedacht habe? – Davis

+0

Arbeitete wie ein Charme. Danke für Ihre Hilfe! – Davis

Verwandte Themen