Мой код пропускает память (python)? - PullRequest
0 голосов
/ 28 ноября 2009
    links_list = char.getLinks(words)
    for source_url in links_list:
        try:
            print 'Downloading URL: ' + source_url
            urldict = hash_url(source_url)
            source_url_short = urldict['url_short']
            source_url_hash = urldict['url_short_hash']
            if Url.objects.filter(source_url_short = source_url_short).count() == 0:
                    try:
                        htmlSource = getSource(source_url)
                    except:
                        htmlSource = '-'
                        print '\thtmlSource got an error...'
                new_u = Url(source_url = source_url, source_url_short = source_url_short, source_url_hash = source_url_hash, html = htmlSource)
                new_u.save()
                time.sleep(3)
            else:
                print '\tAlready in database'
        except:
            print '\tError with downloading URL..'
            time.sleep(3)
            pass


def getSource(theurl, unicode = 1, moved = 0):
    if moved == 1:
        theurl = urllib2.urlopen(theurl).geturl()
    urlReq = urllib2.Request(theurl)
    urlReq.add_header('User-Agent',random.choice(agents))
    urlResponse = urllib2.urlopen(urlReq)
    htmlSource = urlResponse.read()
    htmlSource =  htmlSource.decode('utf-8').encode('utf-8')
    return htmlSource

В основном этот код выполняет ... он берет список URL-адресов и загружает их, сохраняет их в БД. Вот и все.

Ответы [ 4 ]

1 голос
/ 28 ноября 2009

возможно, ваш процесс использует слишком много памяти, а сервер (возможно, общий хост) просто убивает его, потому что вы исчерпали квоту памяти.

здесь вы используете вызов, который может съесть много памяти:

links_list = char.getLinks(words)
for source_url in links_list:
     ...

Похоже, вы можете создать целый список в памяти, а затем работать с элементами. Вместо этого может быть лучше использовать итератор, где объекты извлекаются по одному за раз. Но это предположение, потому что по вашему коду трудно сказать, что делает char.getLinks

если вы используете Django в режиме отладки, то использование памяти возрастет, как предлагает Марк.

0 голосов
/ 28 ноября 2009

Возможно, вам следует получить сервер заданий, например beanstalkd , и подумать о том, чтобы делать по одному за раз.

Сервер заданий будет запрашивать те, которые не пройдены, что позволит завершить работу остальных. Вы также можете одновременно запустить более одного клиента (даже на нескольких машинах).

Более простой дизайн, более легкий для понимания и тестирования, более отказоустойчивый, повторяемый, более масштабируемый и т. Д. *

0 голосов
/ 28 ноября 2009

Самый простой способ проверить это - обратиться к диспетчеру задач (в Windows - или эквивалентном на других платформах) и проверить требования к памяти процесса Python. Если он остается постоянным, нет утечек памяти. Если нет, то у вас где-то есть утечка памяти, и вам нужно будет отладить

0 голосов
/ 28 ноября 2009

Если вы делаете это в Django, убедитесь, что DEBUG имеет значение False, иначе он будет кэшировать каждый запрос.

См. FAQ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...