2015-11-12 4 views
5

私はShiny Applicationを開発しました。起動すると、いくつかのデータセットがロードされます。およそ4 GBのデータテーブル。次に、アプリケーションに接続する人々は、インターフェイスを使用して、それらのデータテーブルで遊ぶことができます。Djangoアプリケーションは、すべての要求で共有されている大きなPandaオブジェクトをメモリに持っていますか?

このアプリケーションはいいですが、いくつかの制限があります。それが私が別の解決策を探している理由です。

私の考えは、パンダとジャンゴを一緒に働かせることです。このようにして、インタフェースとRESTful APIを同時に開発することができました。しかし、私が必要とするのは、Djangoに来るすべてのリクエストが、一度ロードされたpandasデータテーブルを使用できるということです。どんなリクエストでも4GBのメモリをロードしなければならないと想像してみてください...恐ろしいでしょう。

私はどこにでも見ましたが、これを行う方法は見つかりませんでした。私はこの質問を見つけた:https://stackoverflow.com/questions/28661255/pandas-sharing-same-dataframe-across-the-requestしかし、それは応答がありません。

なぜデータをRAMに保存する必要がありますか?なぜなら、質問された結果をすばやく表示するためにはパフォーマンスが必要だからです。私はMariaDBに、Pythonや他の言語の唯一のRや特別なパッケージができる計算が含まれているなど、それらのデータを計算して維持するよう求めることはできません。

答えて

2

あるオブジェクトを一度だけロード(インスタンス化)してすべての要求で使用するのと同じような使用例があります。ロードに時間がかかります(秒)ので、すべてのリクエストを紹介します。

Django>=1.7の機能、AppConfig.ready()の機能を使用してこれを1回だけロードします。ここで

はコードです:

# apps.py 
from django.apps import AppConfig 
from sexmachine.detector import Detector 

class APIConfig(AppConfig): 
    name = 'api' 

    def ready(self): 
     # Singleton utility 
     # We load them here to avoid multiple instantiation across other 
     # modules, that would take too much time. 
     print("Loading gender detector..."), 
     global gender_detector 
     gender_detector = Detector() 
     print("ok!") 

次に、あなたがそれを使用したい場合:

from api.apps import gender_detector 
gender_detector.get_gender('John') 

ready()方法でデータテーブルをロードして、どこからでもそれを使用します。私はテーブルが各WSGIワーカーに一度ロードされると思いますので、ここで注意してください。

+0

こんにちはデュクルボディ あなたの答えをありがとう!良い感じ。 WSGI労働者の数を制限することは可能だと思いますか?そしてそれらのすべてにデータを準備しますか?それは完璧だろう! よろしくお願いいたします。 Jerome – FrelonQuai

+0

WSGIワーカーの数を簡単に制限できます。たとえば、Gunicornでは 'gunicorn wsgi_app_object --workers 'を使用します。 – dukebody

+0

あなたの答えをお返事いただきありがとうございます!私はそれができることだと思う! – FrelonQuai

0

私はこの問題を誤解しているかもしれませんが、ユーザーがすぐにアクセスできる4 GBのデータベーステーブルを持っている私には、あまり問題はないはずです。あなたが説明したように、実際にデータを1回前に読み込むだけで何か問題はありますか? 4GBはあまりRAMではありません。

個人的には、メモリにデータを読み込んでPythonで処理するのではなく、データベースシステム自体を使用することをおすすめします。データを適切に設定すると、わずか数秒で数千ものクエリを発行できます。 Pandasは実際にはSQLを模倣するように書かれているので、使用しているコードのほとんどはおそらくSQLに直接変換できます。ちょうど最近私は、大きな結合操作を基本的にセットアップして、パンダを使用して数百のファイル(合計で4GB〜各ファイルごとに600k行)を取るという状況がありました。実行時間の合計は72時間などとなり、これは1時間に1回実行する必要があった操作でした。同僚は同じpython/pandasコードを72時間ではなく5分で終了する非常に単純なSQLクエリとして書き直しました。

とにかく実際のデータベーステーブルにパンダのデータフレームを保存することをお勧めします。 Djangoはデータベース(通常はmySQLまたはPostgres)上に構築され、パンダにはデータフレームをデータベースdataframe.to_sql('database_connection_str')に直接挿入する機能もあります!そこから、レスポンスがDBに単一のクエリを行い、値をフェッチし、タイムリーにデータを返すように、ジャンゴコードを書くことができます。

+0

こんにちはchill_turnerとあなたの答えに感謝します。 データが一度読み込まれると、サーバー側で一度読み込まれることを意味します。そして決してクライアント側。クライアントはインターフェースを使用でき、リクエストはShinyとShinyに送信され、回答が返されます。 あなたの目的をよく理解していれば、それはmariaDBテーブルをメモリに入れることになりますか?私の問題は、MariaDBがいくつかの操作を行うことができないということです。 aFieldでグループ化し、各グループの最初と3番目の行(anotherFieldによって順序付けされている)を持っているとします。またはMariaDBで利用できないその他のものがいくつかありますか? – FrelonQuai

+0

こんにちは - 私はMariaDBについて言及していませんが、あなたが選んだのであればそれを使うことができます。彼らはdjangoでうまくいくので、私はpostgresまたはmysqlを使用します。データをdjangoデータベースにロードしたら、「ユーザーがページXに行ったときに大丈夫です」というPythonコードを記述します。これら3つの関数を実行してデータベースを呼び出し、処理されたものを返します。それはちょうどdjango(および他の同様のWebフレームワーク)が構築されているものです! –

関連する問題