所以我正在尝试为美国和加拿大编写我自己的地理编码数据库,因为我需要令人难以置信的速度,而且没有速率限制。我有轨道批量地理编码的以下算法,但我想知道是否有更好的方法来急切加载初始批次的城市。我一直在进行基准测试,我已经把它归结为这个算法,它在大约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
答案 0 :(得分:1)
我唯一能想到的就是检查find_in_batches并增加批量。 find_each
默认为1000 - 我猜你可能会对性能进行调整。
答案 1 :(得分:1)
绝对是我能够做到的最好的改进,因为城市的城市数量庞大,只能打到数据库一次。
符文.where
查询,然后使用
array.select { |x| ... }[0]
过滤结果。这使我的基准下降了3/4。 (20秒到4.8秒)