2017-02-14 8 views
0
class FindHits(object): 

    def __init__(self, a, b): 
     self.a = a 
     self.b = b 

    def calculate_hits(): 
     # Some expensive calculation using arguments self.a, and self.b 
     df = pd.DataFrame() 
     return df 

私はいくつかのヒットを計算するクラスを持っています。計算とデータ検索プロセスはかなり高価です。ですから、与えられたパラメータセットに対して、私は "calculate_hits"の結果を保持したいと思います。私はそうしたいので、これらの結果が瞬間または時間後に再び必要になったときに、計算と検索をやり直す必要はありません。Pyramidフレームワーク内のリクエスト間でpandas DataFrame(高価な計算)をキャッシュ/メモする方法はありますか?

Naually、出力結果をPyramidフレームワーク内のセッションオブジェクトに入れてみました。これは、パンダのDataframeが大きすぎるためにはうまくいかなかった...(そして他にも問題があるかもしれない)。

どうすればいいですか?

[追加のコンテキストについては、私はパンダのデータフレームでいくつかの値を計算しています。次に、jquery DataTableにテーブル全体を表示します。私は選択された行を見つけるためにフロントエンドを使います。私は選択された行のリストを返送しています。今度は、Dataframeの行に行き、そのデータフレームから情報を取り出してデータベースに保存したいと思っています)。

答えて

1

要求を超えて共有できる、ある種の同期データストアを定義する必要があります。これが外部(redis、memcache、rdbms、...)でない場合は、おそらくロック付きのメモリ内のストアについて質問しています。あなたはそのような店をregistryに付けて、各要求からそれにアクセスすることができます。 2つ以上の要求がストアを一度に更新しないように、ここでスレッドの問題を認識し、ストアを適切にロックするのはユーザーの責任です。サイドノートとして

def main(...): 
    config.registry.mystore = {'frame': pd.DataFrame()} 

def view(request): 
    frame = request.registry.mystore['frame'] 

パンダのデータフレームは、スレッドセーフですが、私はそうでないことを賭けたい場合は、それ以上にシリアライズで何とかそれに対処する必要がありますので、私は、見当がつかない要求ごとに新しいデータフレームにデシリアライズします。