如何在标准环境中将文件加载到Google App Engine

时间:2018-10-28 09:37:14

标签: python google-app-engine keras gensim google-app-engine-python

我正在将Google-App-Engine标准(非弹性)环境与Python2.7配合使用,并且需要加载一些经过预训练的模型(Gensim的Word2vec和Keras的LSTM)。

我需要加载一次(因为它非常慢-大约需要1.5秒),并且需要几个小时才能快速访问。

最佳和最快的方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:2)

恕我直言,单个请求需要随时访问的只读数据(包括导入的代码!)的最佳位置是全局应用程序变量区域。

此类变量通常会在每个GAE实例生命周期内完全加载一次,并且在该实例消失之前一直可用。

由于数据加载非常昂贵,因此您需要注意,这可能会影响实例启动时(即加载请求仍处于活动状态时)传入请求的响应时间。有两种解决方法:

  • 一种方法是使用“延迟”加载数据-如果仅一小部分传入请求实际需要数据,则有效。但是在数据不可用时实际需要数据的请求仍会受到影响,因此只会减少问题的影响。 App Engine Startup time and the Global Variable problem文章中详细描述了该方法:

    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
    
  • 另一种可以完全消除问题的方法是使您的应用支持warmup requests(仅在使用自动缩放时可用)。数据将由预热请求处理程序加载,并且始终可用于“实时”请求(因为在预热请求处理完成之前,不会将“实时”请求路由到实例)。

如果/当您知道不再需要(例如,在那几个小时之后)时,可以添加逻辑以从内存中删除数据(以减少应用程序的内存占用量)提到的已过期),但这会使图片复杂化,尤其是如果您将应用配置为threadsafe。我只是将不需要数据的代码与在不同服务中需要的代码分开,并在不再需要时使用自动缩放功能关闭具有全局数据的实例。