Geopy 太慢 - 一直超时

Posted

技术标签:

【中文标题】Geopy 太慢 - 一直超时【英文标题】:Geopy too slow - timeout all the time 【发布时间】:2015-07-19 21:47:39 【问题描述】:

我正在使用 geopy 来获取城市名称的纬度 - 经度对。 对于单个查询,这很好用。我现在尝试做的是迭代 大量城市名称(46.000)并获取每个城市的地理编码。之后,我通过一个检查循环运行它们,该循环将城市(如果它在美国)分类到正确的州。我的问题是,我得到“GeocoderTimedOut('服务超时')” 一直以来,一切都非常缓慢,我不确定这是我的错还是只是地质性质。 这是负责的代码sn-p:

for tweetcount in range(number_of_tweets):

#Get the city name from the tweet
city = data_dict[0]['tweetList'][tweetcount]['user']['location']

#Sort out useless tweets
if(len(city)>3 and not(city is None)): 

    # THE RESPONSIBLE LINE, here the error occurs
    location = geolocator.geocode(city);

    # Here the sorting into the state takes place
    if location is not None:
        for statecount in range(len(data)):
            if point_in_poly(location.longitude, location.latitude, data[statecount]['geometry']):

                state_tweets[statecount] += 1;
                break;

不知何故,这一行每隔 2./3 就会抛出一次超时。称呼。城市有形式 “曼彻斯特”,“纽约,纽约”或类似的东西。 我已经尝试过 - 除了所有东西周围的块,但这并没有真正改变问题的任何内容,所以我暂时删除了它们......任何想法都会很棒!

【问题讨论】:

不相关但if location is not None: 会更易读 您是否尝试增加超时? geolocator.geocode(city, timeout=10); 即使超时 = 10,我仍然得到错误。如果我运行代码 5 次,我通常会得到 3-4 次错误,另外 1-2 次它运行良好,尽管它需要的时间比它应该的要长一些。 【参考方案1】:

您将受制于所使用的任何地理定位器服务。 geopy 只是不同 Web 服务的包装器,因此如果服务器繁忙,可能会失败。我会围绕geolocator.geocode 调用创建一个包装器,如下所示:

def geocode(city, recursion=0):
    try:
        return geolocator.geocode(city)
    except GeocoderTimedOut as e:
        if recursion > 10:      # max recursions
            raise e

        time.sleep(1) # wait a bit
        # try again
        return geocode(city, recursion=recursion + 1)

这将在延迟 1 秒后重试 10 次。根据您的喜好调整这些数字。

如果您反复询问同一个城市,您应该考虑将其包装在某种记忆中,例如this decorator。 由于您尚未发布可运行代码,因此我无法对此进行测试。

【讨论】:

【参考方案2】:

你应该改变你的线路:

location = geolocator.geocode(city);

location = geolocator.geocode(city,timeout=None);

【讨论】:

以上是关于Geopy 太慢 - 一直超时的主要内容,如果未能解决你的问题,请参考以下文章

简单几招模拟网络超时情况

机器太慢,导致获取系统剪贴板数据超时

请问浏览器一直显示连接超时到底是啥原因

代码一直超时

android友盟一键登录一直报超时

Java 设置session时间超时,一直没有效果,具体该怎么操作