Как загрузить файлы в Google-App-Engine в стандартной среде - PullRequest
0 голосов
/ 28 октября 2018

Я использую стандартную среду Google-App-Engine (не гибкий) с Python2.7, и мне нужно загрузить несколько предварительно обученных моделей (Word2vec Генсима и LSTM Кераса).

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

Какой самый лучший и быстрый способ сделать это?

Спасибо!

1 Ответ

0 голосов
/ 28 октября 2018

ИМХО, лучшим местом для данных только для чтения (включая импортированный код!), К которым необходимо обращаться в любое время по отдельным запросам, является область глобальных переменных приложения.

Такие переменные обычно загружаются ровно один раз заВремя жизни экземпляра GAE и доступно, пока экземпляр не исчезнет.

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

  • Один из них - использовать «ленивую» загрузку данных - эффективно, если данные нужны только небольшому проценту входящих запросов.Но запросы, которым на самом деле нужны данные, когда они недоступны, все равно будут затронуты, поэтому это просто уменьшит влияние проблемы.Этот метод подробно описан в времени запуска App Engine и проблеме глобальных переменных статья:

    from google.appengine.ext import ndb
    # a global variable
    gCDNServer = None
    def getCDN():
        global gCDNServer
        if gCDNServer==None:
            gCDNServer = Settings.query(Settings.name == "gCDNServer").value
        return gCDNServer
    
  • другой подход, который полностью устранит проблему,чтобы приложение поддерживало запросов на разогрев (доступно только при использовании автоматического масштабирования).Данные будут загружены обработчиком запросов на разогрев и всегда будут доступны для «живых» запросов (поскольку «живые» запросы не будут направлены в экземпляр до завершения обработки запроса на разогрев).

Возможно добавить логику для удаления данных из памяти (чтобы уменьшить объем памяти приложения), если / когда вы знаете, что это больше не понадобится (т.е. после нескольких часов, которые вы упомянулисрок действия), но это усложняет картину, особенно если вы настроили приложение как threadsafe.Я бы просто отделил код, который не нуждается в данных, от кода, который используется в разных сервисах, и оставил бы автоматическое масштабирование, чтобы отключить экземпляры с глобальными данными, когда они больше не нужны.

...