如何在标准环境中将文件加载到 Google-App-Engine
How to load files to Google-App-Engine in standard enviroment
我正在使用 Google-App-Engine 标准(非 flex)环境和 Python2.7,我需要加载一些预训练模型(Gensim 的 Word2vec 和 Keras 的 LSTM)。
我需要加载它一次(因为它非常慢 - 大约需要 1.5 秒)并使其保持快速访问几个小时。
最好和最快的方法是什么?
谢谢!
恕我直言,需要随时由各个请求访问的只读数据(包括导入的代码!)的最佳位置是全局应用程序变量区域。
此类变量通常会在每个 GAE 实例生命周期内恰好加载一次,并且在实例消失之前可用。
由于加载数据的成本很高,您需要注意它可能会影响实例启动时(即加载请求仍处于活动状态时)传入请求的响应时间。有两种方法可以解决这个问题:
一种方法是使用 "lazy" 加载数据 - 如果只有一小部分传入请求实际需要数据,则有效。但是当数据不可用时实际需要数据的请求仍然会受到影响,因此它只会减少问题的影响。方法在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(仅当您使用自动缩放时才可用)。数据将由预热请求处理程序加载,并且始终可用于 "live" 请求(因为在预热请求处理完成之前,不会将 "live" 请求路由到实例)。
可能可以添加逻辑以从内存中删除数据(以减少应用程序的内存占用)if/when您知道不再需要它(即在您提到过期的那几个小时之后),但这会使情况复杂化,尤其是如果您将应用程序配置为 threadsafe
。我只是将不需要数据的代码与在不同服务中需要数据的代码分开,并让自动缩放在不再需要时关闭具有全局数据的实例。
我正在使用 Google-App-Engine 标准(非 flex)环境和 Python2.7,我需要加载一些预训练模型(Gensim 的 Word2vec 和 Keras 的 LSTM)。
我需要加载它一次(因为它非常慢 - 大约需要 1.5 秒)并使其保持快速访问几个小时。
最好和最快的方法是什么?
谢谢!
恕我直言,需要随时由各个请求访问的只读数据(包括导入的代码!)的最佳位置是全局应用程序变量区域。
此类变量通常会在每个 GAE 实例生命周期内恰好加载一次,并且在实例消失之前可用。
由于加载数据的成本很高,您需要注意它可能会影响实例启动时(即加载请求仍处于活动状态时)传入请求的响应时间。有两种方法可以解决这个问题:
一种方法是使用 "lazy" 加载数据 - 如果只有一小部分传入请求实际需要数据,则有效。但是当数据不可用时实际需要数据的请求仍然会受到影响,因此它只会减少问题的影响。方法在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(仅当您使用自动缩放时才可用)。数据将由预热请求处理程序加载,并且始终可用于 "live" 请求(因为在预热请求处理完成之前,不会将 "live" 请求路由到实例)。
可能可以添加逻辑以从内存中删除数据(以减少应用程序的内存占用)if/when您知道不再需要它(即在您提到过期的那几个小时之后),但这会使情况复杂化,尤其是如果您将应用程序配置为 threadsafe
。我只是将不需要数据的代码与在不同服务中需要数据的代码分开,并让自动缩放在不再需要时关闭具有全局数据的实例。