2017-02-21 25 views
1

私は大規模なデータセットで作業していますが、私は8GBのRAMを持つローカルマシンで地理空間解析を実行しようとしています。私は自分のマシンのリソースを超えているように見えます。自分のマシンをマシン上で実行できるように私のモデルを最適化できるかどうかは疑問です。距離の最適化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)) 

それは距離を計算し、その後、私はareaの数でstationsの数を乗じで終わるしないようにstationによってstationで最小距離を見つけることは可能ですか?それとも、リソースを節約する方法でこれを実行したり、ジョブを分割してRAMに収めることができる別のソリューションがありますか?

答えて

1

gapp()を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

関連する問題