0

所以我正在尝试为美国和加拿大编写自己的地理编码数据库,因为我需要令人难以置信的速度,并且没有速率限制。我有以下用于 Rails 批量地理编码的算法,但我想知道是否有更好的方法来急切加载初始批次的城市。我一直在进行基准测试,我已经把它归结为这个算法,它在大约 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
4

2 回答 2

1

我唯一能想到的就是检查find_in_batches并增加你的批量大小。 find_each默认为 1000 - 我猜你可能会为了性能稍微调整一下。

于 2013-11-10T00:19:50.087 回答
1

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

运行.where查询,然后使用

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

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

于 2013-11-10T01:50:38.490 回答