我到目前为止找到的最佳解决方案是,
using Two10.CountryLookup;
var lookup = new ReverseLookup();
try
{ // get country details based on lat/long
var country = lookup.Lookup(float.Parse(scandata.gpslat), float.Parse(scandata.gpslong));
string cName = country.name;
string cCode = country.code;
}
catch(Exception e)
{
Console.WriteLine("Exception :"+e);
}
但是这个对象太重了,我有数百万条记录要经过。这个对象使我的脚本变慢。还有其他更快的方法吗?
答案 0 :(得分:1)
如果您在网站上阅读自述文件,它会告诉您ReverseLookup对象的创建很昂贵。因此他们希望您创建一次然后重复使用它。
https://github.com/vansha/Two10.CountryLookup/blob/master/readme.md
它很昂贵,因为它加载并解析构造函数中的整个7.1MB区域列表。
我刚刚进行了一些测试。每次查询20个位置并创建ReverseLookup对象需要10秒钟。创建一次并重复使用20次需要0.6秒。重复使用2000次需要2秒钟。
答案 1 :(得分:1)
如果您阅读了库的源代码,则会加载区域列表。
var ar = [{_id : "1", S : "2"},{_id : "1", M : "4"},
{_id : "2", M : "1"},{_id : "" , M : "1"},{_id : "3", S : "3"}]
_(ar).groupBy('_id').thru(function(o){
return _.keys(o).reduce(function(arr, key) {
var r = {
_id: key,
S: parseInt((_.find(o[key], function(i){ return i["S"]}) || {S:0}).S, 10),
M: parseInt((_.find(o[key], function(i){ return i["M"]}) || {M:0}).M, 10)
};
arr.push(_.merge(r, {Total: r.S+r.M}));
return arr;
}, [])
}).value();
即使this.Regions = ParseInput(LoadFile()).ToArray();
和ParseInput()
延迟执行它们,它立即将LoadFile()
强制转换为一个数组,该数组执行它并强制对每个构造函数进行求值。这是一项昂贵的操作,所以应该设置一次。
您应该构建一次IEnumerable<Region>
项,或者在ReverseLookup
Singleton.
并按原样使用:
public class RegionLocator
{
private static RegionLocator instance;
private static ReverseLookup ReverseLookup;
private RegionLocator() { }
public static RegionLocator Instance
{
get
{
if (instance == null)
{
instance = new RegionLocator();
ReverseLookup = new ReverseLookup();
}
return instance;
}
}
public Region Lookup(float lat, float lng, RegionType[] types)
{
return ReverseLookup.Lookup(lat, lng, types);
}
public Region[] Regions()
{
return ReverseLookup.Regions;
}
}