【问题标题】:Why does my geopy loop always in end in Killed: 9?为什么我的 geopy 循环总是以 Killed: 9 结尾?
【发布时间】:2019-02-07 18:01:47
【问题描述】:

我有一个地址列表,但当我尝试添加坐标时却得到了 Kill 9 错误。

是否超时?我添加了睡眠时间来防止它。

我收到此错误Killed: 9

def do_geocode(Nominatim, address):
    time.sleep(3)
    try:
        return Nominatim.geocode(address)
    except GeocoderTimedOut:
        return do_geocode(Nominatim,address)

def addCoordinates(businessList):
    businessList[0] = ["pageNum","entryNum","name","address","tagOne","tagTwo","tagThree","geoAddress","appendedLocation","latitude","longitude","key"]

    geolocator = Nominatim(timeout=None)
    z = 0
    i=1
    while i < len(businessList):
        longitude = ""
        latitude = ""
        geoLocation = ""
        geoAddress = ""
        entry = []

        appendedLocation = (businessList[i][3] + ", San Francisco")

        geoLocation = do_geocode(geolocator, appendedLocation)

        if geoLocation is not None:
            geoAddress = geoLocation.address
            latitude = geoLocation.latitude
            longitude = geoLocation.longitude

            entry = [geoAddress, appendedLocation, str(latitude), str(longitude)]
            j=0
            while j < len(entry):
                businessList[i] += [entry[j]]
                j+=1
            print("coordinates added")
            z +=1
            print(z)

        i+=1

【问题讨论】:

    标签: python geopy


    【解决方案1】:

    Killed: 9 可能意味着您的 Python 脚本已被操作系统中的某些东西终止(可能是 OOM 杀手?)。确保您的脚本不会占用机器的全部可用内存。

    对于geopy,我建议看一下RateLimiter 类。另请注意,使用 Nominatim 时需要指定唯一的用户代理(在the Nominatim class docs 中进行了解释)。你会得到这样的东西:

    from geopy.extra.rate_limiter import RateLimiter
    
    
    def addCoordinates(businessList):
        businessList[0] = ["pageNum","entryNum","name","address","tagOne","tagTwo","tagThree","geoAddress","appendedLocation","latitude","longitude","key"]
    
        geolocator = Nominatim(user_agent="specify_your_app_name_here", timeout=20)
        geocode = RateLimiter(
            geolocator.geocode, 
            min_delay_seconds=3.0,
            error_wait_seconds=3.0,
            swallow_exceptions=False, 
            max_retries=10,
        )
        z = 0
        i=1
        while i < len(businessList):
            longitude = ""
            latitude = ""
            geoLocation = ""
            geoAddress = ""
            entry = []
    
            appendedLocation = (businessList[i][3] + ", San Francisco")
    
            geoLocation = geocode(appendedLocation)
    
            if geoLocation is not None:
                geoAddress = geoLocation.address
                latitude = geoLocation.latitude
                longitude = geoLocation.longitude
    
                entry = [geoAddress, appendedLocation, str(latitude), str(longitude)]
                j=0
                while j < len(entry):
                    businessList[i] += [entry[j]]
                    j+=1
                print("coordinates added")
                z +=1
                print(z)
    
            i+=1
    

    【讨论】:

    • 我使用了这个代码。我仍然收到killed 9错误。我已经尝试了几次,它通常可以在第 120 到 130 个请求之前运行。
    • 我认为是内存问题。即将再次出现错误(在坐标 120 上),活动监视器显示 python 进程的实际内存大小:1.24GB,虚拟内存大小:35GB,共享内存大小:284kb,私有内存大小:1.23GB
    • 我正在查看代码,但不确定要破解哪一部分。它是否持有导致这种内存需求的 businessList 对象?有没有办法查看一个对象正在施加多少内存压力?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 2016-03-02
    • 2012-02-26
    • 2012-02-28
    • 2018-05-26
    • 2019-01-20
    • 2021-06-04
    相关资源
    最近更新 更多