我正在开发我的第一个 web 应用程序。我正在使用 Flask 在 Python 中执行此操作,我想运行一段 Python 代码,该代码使用 Pickle 从一个包含所有必要数据的几 MB 的(二进制)文件中获取一个对象。有人告诉我,由于可扩展性,在 Web 应用程序中使用 Pickle 并不是一个好主意;为什么?
显然,对于给定的目的,最好只获取必要的数据。但是,如果我使用 Elasticsearch 数据库并以最快的方式执行此操作,则整个过程花费的时间比我一次从二进制文件中获取所有数据要多大约 100 倍;一旦二进制文件被解开,最多需要一秒钟,计算速度非常快,所以我想知道我是否应该使用二进制文件,如果是这样,如何以可扩展的方式进行。
请您参考如下方法:
所以这也是我必须处理的事情。就我而言,情况更糟,我的可能有数百 MB 或更多。
我的第一个问题是:
pickle 数据是否发生变化,如果发生变化,可以在何处/由谁进行更改?
您是否需要多组此类数据? (对我来说,不同的人在不同的时间需要 1000 个)
多久需要一次?
这些问题的答案确实提出了处理它的不同方法。
假设你有一大堆请求需要的东西,并且对每个人都是一样的,你知道你很快就会需要它 - 我会在应用程序启动时加载它并保留它在内存中或在第一次请求时延迟加载它(然后将其保存在内存中)。
另一种方法是将大量数据拆分到自己的 Flask 应用程序中。
# api.py: your api flask application
from flask import Flask, jsonify, request
api_app = Flask(__name__)
big_gis_object = unpickle(...)
@api_app.route('/find_distance')
def find_distance():
# grabbing the parameters for this request
lat, lon = request.args['lat'], request.args['lon']
# do your normal geo calculations here
distance = big_gis_object.do_dist_calcs(lat, lon)
# return the result as json to make things easy
return jsonify(distance=distance)
# app.py: your main flask application
import requests
from flask import Flask, render_template
main_app = Flask(__name__)
@main_app.route('/')
def homepage():
# this is how you ask the geo api app to do something for you
# note that we're using the requests library do make it easier
# - http://docs.python-requests.org/en/latest/user/quickstart/
resp = requests.get('http://url_to_flask_app/find_distance', params=dict(lat=1.5, lon=1.7))
distance = resp.json()['distance']
return render_template('homepage.html', distance)
然后如何配置这些将取决于负载/要求。虽然它很灵活。比方说,你的主要前端可以有 40 个进程,而只有 1 个 api 进程(尽管它一次只能做一件事)。如果您需要更多的 api 进程,只需对其进行扩展,直到您获得适当的平衡。代价是 api 进程需要更多内存。
这一切都有意义吗?
