2015-06-26 52 views
2

我正在處理我的第一個網絡應用程序。我用Flask做Python,我想運行一段Python代碼,從一個包含所有必要數據的幾MB的(二進制)文件中取一個Pickle對象。我被告知,在一個Web應用程序中使用Pickle並不是一個好主意,因爲它具有可伸縮性。爲什麼?是否可以在需要可擴展的Python Web應用程序中取消大量數據?

很明顯,對於一個特定的目的,最好只取得必要的數據。但是,如果我這樣做,使用Elasticsearch數據庫並以最快的方式執行,整個過程比從二進制文件一次獲取所有數據的時間多100倍。一旦二進制文件被取消,最多需要一秒鐘,計算速度非常快,所以我想知道是否應該使用二進制文件,如果是,如何以可擴展的方式進行。

回答

2

所以這是我也必須處理的。就我而言,情況更糟,我的MB可以達到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流程需要更多的內存。

這一切都有意義嗎?

+0

Hi @AidanKane,謝謝!我們會不時更新數據,不時取消,每月一次;它是地理空間數據,公共交通數據......這種東西,每個人都是一樣的。現在它只是一個大約10MB的文件。所以我只是加載它作爲一個全局變量? – Daniel

+0

在這種情況下,我可能會。這會影響記憶。所以,這取決於你將運行多少個進程(取決於負載),因爲每個進程都有一個數據副本。另一種方法是實際將加載的數據移動到一個單獨的帶有api訪問權限的應用程序中。這樣,您可以根據需要獲得儘可能多的內存飢餓進程,並且爲前端提供完全獨立的應用程序。 –

+0

全局變量方法 - 或者真的,在你的情況下是不變的,所以我們可以更好地瞭解:-) - 實現起來非常簡單,我會從那裏開始。如果不瞭解加載/訪問模式以及未對代碼進行分析,那麼很難說您何時需要繼續下一步(更復雜)的步驟。 –

0

Pickle文件是在python中加載數據的好方法。順便考慮使用C實現:cPickle

如果你想縮放,使用pickle文件。理想情況下,您希望查找適合您的數據和項目需求的分區密鑰。

比方說,如果您有歷史數據,而不是使用包含所有歷史數據的單個文件,則可以爲每個日期創建一個pickle文件。

相關問題