数据库地理编码调整rails

时间:2013-11-10 00:05:22

标签: ruby-on-rails ruby-on-rails-4 geocoding

所以我正在尝试为美国和加拿大编写我自己的地理编码数据库,因为我需要令人难以置信的速度,而且没有速率限制。我有轨道批量地理编码的以下算法,但我想知道是否有更好的方法来急切加载初始批次的城市。我一直在进行基准测试,我已经把它归结为这个算法,它在大约19秒内给我1000个地理编码,覆盖率约为50%。

我的问题是,在尝试“向下钻取”时,是否有更好的操作方法而不是重新查询数据库?

ids = City.where('lower(name) IN (?)', locations).pluck(:id) # Eager load the only possible results
results.find_each do |r|
  #next if r.location = 'EXACT'
  names = r.location.split(',')
  state = get_state(names)
  city = City.where(:id => ids, :state => state[0]).where('lower(name) IN (?)', names).first # Drill down to the appropriate state

  if city.nil?
    city = City.where(:id => ids).where('lower(name) IN (?)', names).first # Hail Mary
  end

  # Return if nil?
  if city.blank?
    puts "Oh no! We couldn't find a city for #{r.location}"
  else
    # Finally, the city
    puts "Selected #{city.name} for #{r.location}"
    r.latitude = city.latitude
    r.longitude = city.longitude
    r.save
  end
end

2 个答案:

答案 0 :(得分:1)

我唯一能想到的就是检查find_in_batches并增加批量。 find_each默认为1000 - 我猜你可能会对性能进行调整。

答案 1 :(得分:1)

绝对是我能够做到的最好的改进,因为城市的城市数量庞大,只能打到数据库一次。

符文.where查询,然后使用

array.select { |x| ... }[0] 

过滤结果。这使我的基准下降了3/4。 (20秒到4.8秒)