Как я могу сделать этот код гладко работать на Google App Engine? - PullRequest
0 голосов
/ 19 апреля 2011

Я новичок в веб-приложениях, поэтому я не очень привык беспокоиться об ограничениях процессора, но, похоже, у меня возникнут проблемы с этим кодом. Я прочитал на странице квот Google, что я могу использовать 6,5 ЦП в день, 15 ЦП, минут в минуту.

Google сказал:

Время ЦП указывается в «секундах», что эквивалентно количеству циклов ЦП, которые может выполняться процессором Intel x86 с тактовой частотой 1,2 ГГц за это время. Настоящий количество затрачиваемых циклов ЦП сильно зависит от внутренних условий App Engine, так что это число корректируется для целей отчетности, используя этот процессор в качестве ссылки измерение.

И

            Per Day          Max Rate
CPU Time    6.5 CPU-hours    15 CPU-minutes/minute

Что я хочу знать:

Этот сценарий выходит за пределы?

(если да) Как я могу сделать так, чтобы он не превышал лимит?

Я использую библиотеку urllib. Должен ли я использовать Google Fetch API? Почему?

Абсолютно любой другой полезный комментарий.

Что он делает:

Царапает (ползает) проект бесплатного ТВ. Я только полностью выполню его один раз, затем заменю на более короткий и быстрый скрипт.

from urllib import urlopen
import re

alphaUrl = 'http://www.free-tv-video-online.me/movies/'
alphaPage = urlopen(alphaUrl).read()
patFinderAlpha = re.compile('<td width="97%" nowrap="true" class="mnlcategorylist"><a href="(.*)">')
findPatAlpha = re.findall(patFinderAlpha,alphaPage)
listIteratorAlpha = []
listIteratorAlpha[:] = range(len(findPatAlpha))
for ai in listIteratorAlpha:
    betaUrl = 'http://www.free-tv-video-online.me/movies/' + findPatAlpha[ai] + '/'
    betaPage = urlopen(betaUrl).read()
    patFinderBeta = re.compile('<td width="97%" class="mnlcategorylist"><a href="(.*)">')
    findPatBeta = re.findall(patFinderBeta,betaPage)
    listIteratorBeta = []
    listIteratorBeta[:] = range(len(findPatBeta))
    for bi in listIteratorBeta:
        gammaUrl = betaUrl + findPatBeta[bi]
        gammaPage = urlopen(gammaUrl).read()
        patFinderGamma = re.compile('<a href="(.*)" target="_blank" class="mnllinklist">')
        findPatGamma = re.findall(patFinderGamma,gammaPage)
        patFinderGamma2 = re.compile('<meta name="keywords"content="(.*)">')
        findPatGamma2 = re.findall(patFinderGamma2,gammaPage)
        listIteratorGamma = []
        listIteratorGamma[:] = range(len(findPatGamma))
        for gi in listIteratorGamma:
            deltaUrl = findPatGamma[gi]
            deltaPage = urlopen(deltaUrl).read()
            patFinderDelta = re.compile("<iframe id='hmovie' .* src='(.*)' .*></iframe>")
            findPatDelta = re.findall(patFinderDelta,deltaPage)
            PutData( findPatGamma2[gi], findPatAlpha[ai], findPatDelt)

Если я что-то забыл, пожалуйста, дайте мне знать.

Обновление:

Это примерно сколько раз он будет работать и почему в случае, если это полезно при ответе на вопрос.

       per cycle      total
Alpha: 1              1
Beta:  16             16
Gamma: ~250           ~4000
Delta: ~6             ~24000

Ответы [ 3 ]

2 голосов
/ 21 апреля 2011

Я не люблю оптимизировать, пока мне не нужно. Сначала попробуйте. Это может просто сработать. Если вы превысите квоту, пожимает плечами , возвращайтесь завтра.

Чтобы разделить задания на более мелкие части, посмотрите на API очереди задач . Возможно, вы можете разделить рабочую нагрузку на две очереди: одну, которая очищает страницы, и одну, которая обрабатывает их. Вы можете установить ограничения для очередей, чтобы контролировать, насколько агрессивно они выполняются.

P.S. На Regex для HTML: делай то, что работает. Ученые будут призывать вас к семантической корректности, но если это работает для вас, не позволяйте этому останавливать вас.

1 голос
/ 19 апреля 2011

Я использую библиотеку urllib. Должен ли я использовать Google URL Fetch API?Почему?

urlib на производственных серверах AppEngine - это API URLFetch

0 голосов
/ 21 апреля 2011

Маловероятно, что это превысит лимит бесплатного доступа, но невозможно сказать, не увидев, насколько велик список URL-адресов, которые нужно получить, и насколько велики получающиеся страницы.Единственный способ узнать наверняка - это запустить его - и в этом нет ничего страшного.

С большей вероятностью вы столкнетесь с ограничениями на выполнение отдельных запросов - 30 секунд для запросов веб-интерфейса, 10 минутдля внутренних запросов, таких как задание cron, - после завершения квоты.Чтобы устранить эти проблемы, используйте API очереди задач , чтобы разбить вашу работу на множество частей.В качестве дополнительного преимущества они могут работать параллельно!Возможно, вы также захотите изучить Asynchronous URLFetch - хотя это, вероятно, не стоит, если это всего лишь одноразовый скрипт.

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