2012-04-02 4 views
0

私の小さなmapreduceルーチン(Python、Google Appengine)でロックンロールする準備はできていますが、私のデータベースに感染するバグ表。私の処理機能は、次のようになります。私のmapreduceをいくつかのエンティティで操作してテストしたい

def promote(nrhp_aux_entity): 
     ... 
     # I form a query, and use it to get an "nrhp_record". That's the item 
     # I'm actually changing 
     results1 = query1.fetch(limit=1) 
     nrhp_record = results1[0] 
     ... 
     yield op.db.Put(np_record) 

私はそれがnrhp_aux_entityオブジェクトのちょうど少数、その後、ちょうど終了上で実行したいのですが。それから、私は結果を見て、それをテーブル全体で動作させることに決めました。だから、良い計画はある種の世界的なカウンターを持って、そして、例えば、カウンターが5のようないくつかの小さな番号になると、全体のmapreduceを終了することでしょうか?もしそうなら、グローバルカウンターを導入する良い方法は何ですか?

これを行うと、データベーステーブルの5つのエンティティ(約76,000のエンティティを含む)でしか動作していないため、マップリューデンスはすべて1分ほどで完了すると思いますか?

+0

代わりに照会している型をマッピングするか、代わりにgetを使うなど、すべてのマッパー呼び出しでクエリを実行しないようにする方法はありますか?それは通常の地図作成よりもずっと遅くなり、コストも高くなります。また、 'query1.fetch(limit = 1)[0]'よりはるかに簡単です。 'query1.get()'は最初の結果を返します。 –

+0

今、私はremote_apiを使用しています。なぜなら、私はより安全ですからです。しかし、query1.get()に関するヒントをありがとう。状況は私が2つのテーブルを持っているということです。表Bには、私が本当に望んでいたいくつかの余分なフィールドが表Aにありました。テーブルBの項目は少なくなりますが、テーブルBのすべての行について、テーブルAにはその行のすべてのフィールドを「昇格」したい行が1つだけあります。だから、私はテーブルBの各行を繰り返し、すべてのフィールドをテーブルAに昇格しています。テーブルAとテーブルBは "refnum"というフィールドを共有しています。 – egilchri

+1

どこにでもキー名を使用していますか?クエリの代わりに単純なデータストア参照を行うことはできますか? –

答えて

1

私はいくつかのエンティティを新しい種類にコピーし、その新しい種類のマッパーを設定します。高いコンテンションで動作するカウンタを実装することは、別個のテスト環境を作ることよりも難しく、テスト環境は実際のデータに取り組まないという利点があります。

Googleはまた、あなたのプロダクションデータすべてにマッパーを設定する前に、便利なバックアップ/リストア機能をリリースしました。

キューの設定や単一のマッピングタスクの所要時間に応じて、5つのエンティティを超えるマップリダクションにはほとんど時間がかかりません。 200msのように。

関連する問題