我正在将Google-App-Engine标准(非弹性)环境与Python2.7配合使用,并且需要加载一些经过预训练的模型(Gensim的Word2vec和Keras的LSTM)。
我需要加载一次(因为它非常慢-大约需要1.5秒),并且需要几个小时才能快速访问。
最佳和最快的方法是什么?
谢谢!
答案 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
。我只是将不需要数据的代码与在不同服务中需要的代码分开,并在不再需要时使用自动缩放功能关闭具有全局数据的实例。