在需要可扩展的Python Web应用程序中取消大量数据的可行性是否可行?

时间:2015-06-26 08:43:03

标签: python flask scalability binaryfiles

我正在处理我的第一个 web 应用程序。我在使用Flask进行Python操作时,我想运行一段Python代码,该代码使用Pickle从一个包含所有必要数据的几个MB的(二进制)文件中获取一个对象。我被告知,因为可扩展性,所以在Web应用程序中使用Pickle并不是一个好主意;为什么呢?

显然,对于给定的目的,最好只采取必要的数据。但是,如果我使用Elasticsearch数据库并以最快的方式执行此操作,整个过程所需的时间比从二进制文件中一次获取所有数据的时间多100倍;一旦二进制文件被打开,最多需要一秒钟,计算速度非常快,所以我想知道是否应该使用二进制文件,如果是,那么如何以可扩展的方式进行。

2 个答案:

答案 0 :(得分:2)

所以这也是我必须要处理的事情。在我的情况下,更糟糕的是,我的可能是100或MB以上。

我的第一个问题是:

  • 腌制数据是否会发生变化?如果是,可以在何处/由谁更改?

  • 您需要多组这些数据吗? (对我来说,不同的人在不同时间需要1000个)

  • 需要多长时间?

这些问题的答案确实提出了不同的解决方法。

假设你在一堆请求中只需要大量的东西,对每个人都是一样的,并且你知道你很快就会需要它 - 我会在应用程序启动时加载它并保留它在内存中或在第一次请求时延迟加载它(然后将其保存在内存中)。

另一种方法是将重数据位拆分为自己的烧瓶应用程序。

# 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进程需要更多内存。

这一切都有意义吗?

答案 1 :(得分:0)

Pickle文件是在python中加载数据的好方法。顺便考虑使用C实现:cPickle

如果您想使用pickle文件进行缩放。理想情况下,您希望查找适合您的数据和项目需求的分区键。

例如,假设您拥有历史数据,而不是拥有包含所有历史数据的单个文件,您可以为每个日期创建一个pickle文件。