2011-07-11 26 views
2

私はクラウド上で動作しているクローズドシステムに取り組んでいます。フェッチ出力をキャッシュする方法はありますか?

私が必要とするのは、ユーザー型入力正規表現を使用してデータセット内の行をフィルタリングする検索関数です。

phrase = re.compile(request.get("query")) 
data = Entry.all().fetch(50000) #this takes around 10s when there are 6000 records 
result = x for x in data if phrase.search(x.title) 

データベース自体はあまり変更されず、1日に200-300件を超える検索は行われません。

どのようにしてすべてのエントリをキャッシュする方法がありますか(それらのうち50.000を超え、それぞれ500バイト以下であることが予想されます)、取得するのが10秒を超えないでしょうか?あるいは、それを並列化するのでしょうか?私は10cpuの秒を気にしないが、私はユーザーが待たなければならない10秒気にする。

"index it and use .filter()"のような答えに答えるには、クエリは正規表現であり、正規表現を使用できるようにするインデックス付けメカニズムについてはわかりません。

答えて

1

制限のあるエントリがあるので、すべてのエントリをmemcacheして、次に説明したようにメモリ内でフィルタリングを実行できます。ただし、各memcacheエントリは1MBを超えることはできません。しかし、最大32MBのmemcacheエントリを並列にフェッチできます。

エントリをサブセットに分割し、サブセットをmemcacheしてから、memcacheキーを事前に計算して、それらを並列に読み込みます。ここ

より:

http://code.google.com/appengine/docs/python/memcache/functions.html

2

また、あなたはすべてのエンティティへの高速アクセスを持つことができるようにすることによって制限されることなく、アプリエンジンのローカルインスタンス上のデータを保存するためにcachepyまたはperformance engine(恥知らずプラグ)を使用することができますmemcacheの境界またはデータストアの待ち時間。

ヒント:それはメモリのおよそ185メガバイトを超える場合ローカルインスタンスが殺され、あなたは何をやっている知っていれば、あなたが実際にそれのデータのかなり多くを保存することができます。

+0

そこにはうまくいっています:) – systempuntoout

1

データは20MBのオーダであるため、ローカルインスタンスメモリに完全にロードすることができます。できるだけ速くなります。また、データファイルとしてアプリケーションに保存して、データストアにアクセスするよりも速く読むことができます。

+0

ローカルインスタンスメモリに物をロードするにはどうしたらいいですか? – kolinko

+0

@Merlinモジュールにグローバル変数(またはクラス変数)として保存するだけです。 –

関連する問題