我正在开发我的第一个Web应用程序。我正在使用Flask在Python中进行操作,并且我想运行一段Python代码,该代码使用Pickle从包含所有必要数据的数MB的(二进制)文件中获取一个对象。有人告诉我,在Web应用程序中使用Pickle并不是一个好主意,因为它具有可伸缩性。为什么?
显然,对于给定的目的,最好只获取必要的数据。但是,如果我使用Elasticsearch数据库并以最快的方式做到这一点,则与从二进制文件一次获取所有数据相比,整个过程要花费大约100倍的时间。一旦解开二进制文件(最多花费一秒钟),计算速度就会非常快,所以我想知道是否应该使用二进制文件,如果要使用二进制文件,如何使用可扩展的方式。
最佳答案
所以这也是我必须处理的事情。就我而言,情况甚至更糟,我的磁盘可能达到100 MB或更多。
我的第一个问题是:
腌制的数据是否会更改?如果更改,在哪里/可以更改谁?
您是否需要多套该数据? (对我来说,不同的人在不同的时间需要成千上万个)
需要多久一次?
这些问题的答案确实提出了不同的解决方法。
假设您只是一堆请求中需要的大量东西,并且每个人都一样,并且您知道很快就会需要它-我会在应用程序启动时将其加载并保存在内存中,或者延迟在第一次请求时加载它(然后将其保存在内存中)。
另一种方法是将大量数据拆分为自己的烧瓶应用程序。
# 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进程需要更多的内存。
这一切有意义吗?
关于python - 在需要扩展的Python Web应用程序中释放大量数据是否可行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31068690/