距离搜索脚本优化

时间:2017-05-13 20:32:08

标签: r geo purrr

我正在编写一个脚本来确定各种类型(15个不同的值)的位置数量,这些位置在5到30英里范围内,以5英里的邮政编码质心为增量。 (例如,拉链5英里内的1型位置,10英里内类型1的位置数等)。

我对脚本的输入是一个带有拉链和质心的数据框,一个距离矢量,以及一个包含纬度/经度的15个数据帧的列表,其中每个df是某种类型的位置。

总共有14000个地点可以查看30000个邮政编码。在结果集中,我想要一个数据框,其中每一行是zip,列列出了指定距离内15种类型之一的位置数。因此每个拉链有90列(15种* 6距离阈值)

我有脚本,但速度非常慢。获得2个邮政编码的结果需要85秒,100个小时需要100个。我正在运行Microsoft Open R,并且我的机器上有12个核心。

我将purrr包用于我的循环。

require(tidyverse)
require(geosphere)

distance = seq(5, 30, 5)
names(distance) <- seq(5, 30, 5)

res.by.zip <- by_row(zip.smp, function(x) {
  zip.long <- x[["longitude"]]
  zip.lat <- x[["latitude"]]

  dist.vars.lst <- map(distance, function(dist) {
        # Calculate df with distance to zip centroid for each location
        dist.lst <- map(locations.lst,
                    function(uniq.cat.recs){
                      distm(as.matrix(uniq.cat.recs[,c("longitude","latitude")]), 
                            c(zip.long, zip.lat), fun = distHaversine) %>% as.data.frame()
                    } # close pmap function
         ) # close map

    # Calculate number of locations that fall within distance threshold
    recs.lst <- map_int(dist.lst, function(u) {
      filter(u, (V1*0.0006213712) < dist) %>% nrow()  # Haversine output in meters, change to miles
    }
    ) # close map - int vector of # of store types for each distance
  } # close function
  ) # close map - list of integer vectors - each outer element is the distance we test for 
  res.vec <- simplify(dist.vars.lst)
  y <<- names(res.vec)   # save as global var because can't figure out how to get R to automatically append the proper var names to the df
  return(res.vec)
} # close map function
,.collate = "cols"
) # close by_row

names(res.by.zip)[4:ncol(res.by.zip)] <- y   # append column names to the df

以下是带有拉链和位置的df的链接: zips

locations

如何才能提高效率?如果无法在本地进行,我需要在云中使用哪些选项来获得更强大的处理能力?

另外,我不确定MRO是否正在利用所有可用内核。如果我运行getMKLthreads(),则输出为12。

如果我运行setMKLthreads(20),它会告诉我线程数已经达到最大值。

更新:

我使用常规的欧几里德距离函数而不是Haversine进行了测试,它的运行速度提高了约60倍(100拉链时约为1分钟)。这表明距离函数是造成计算时间长的原因。

0 个答案:

没有答案