2011-06-01 9 views
0

私はGoogleアプリエンジンで "逆文書頻度"を実装する必要があります。私は効率を改善するための提案を探しています。今、私は後で私がGAEで "逆文書頻度"を実装するための提案ですか?

、のように、データストアからのフレーズの発生をフェッチWebページを解析するときIDFを計算するとき、私は、のように、データストアに

for(String phrase : phrase_collection){ 
    dataStore.put(phrase, domain); 
} 

を各ペアを保存

、などの基本的なルーチンを取ります

for(String phrase : phrase_collection){ 
    long count = dataStore.get(phrase).size(); 
} 

ただし、速度は満足できるものではなく、30秒のタイムアウトが頻繁に発生します。このシナリオでは、私は追加の課題があります。

- 多言語入力(ウェブページ)。したがって、フレーズもさまざまな言語で表示されるため、キャッシュするのが難しくなります。

- ウェブページとランキングフレーズの解析にも時間がかかる。全体のプロセスはcharset_detect - > language_detect - >異なる言語による解析 - >ランキングのようなものです。

GAEでは常に有効です。

私はどんな提案もお待ちしております!前もって感謝します!

答えて

1

あなたは、各フレーズに対して個別のget(およびput)を行っています。これは自然に非常に遅くなるでしょう。データストアへのラウンドトリップが非常に多いためです。代わりに、エンティティまたはキーの反復可能性を受け入れるputおよびgetのバリアントを使用し、それらをすべて単一のトランザクションで実行する必要があります。

Stefanが提案するように、バックエンドやタスクキューを使用して、この作業を「オフライン」にする必要があります。タスクキューは、ここではよりよくマッチするでしょう。

+0

バッチ・ゲット/プットは、クエリー基準を組み立てるのは難しいが、基本的な考えです。また、私は文章P(同じ文書から)をその文書に対してリアルタイムでランク付けする必要があるため、これをオフラインで行うことはできません。私は、キャッシュとAsyncDataStoreを試していると、それは良い感じ。 – ShuaiYuan

+0

@Shuaiあなたのご意見が分かりません。クエリの条件はバッチのgetやputには適用されません。ここでバッチ処理を行う必要があります。 –

+0

私は1)データストアからすべてのフレーズを取り出し、memcacheに保存することは難しいことを意味しました。ストレージはすべての言語で急速に成長し続けています。 2)各文書のために、すべてではなくその中に登場するフレーズを検索しなければならない。この場合、どのようにバッチを取得できますか? – ShuaiYuan

0

あなたはオプションのカップルを持っている:

あなたが起動している事を得るために新たに導入されたバックエンドを使用することができます。そうすれば、タイムアウトに対処する必要はなく、並列タスクについて心配する必要はありません。

タスクキューを使用できます。 (バックエンドの代わりに)しかし、それはあなたのタスクをパラレル化するあなたの能力に依存します。

いずれにしても、memcacheの使用を開始する必要があります。 (JDOを使用している場合は、単に有効にすることができますlike so)。また、asynアクセスやmemcacheをそのままの状態でサポートする、「よりネイティブな」永続化レイヤー、例えばobjectifyやtwigへの切り替えを検討することもできます。

+0

ありがとうございます!私はバックエンドを最初に試してみます。 – ShuaiYuan