1

すべて/一部の名前空間のすべて/一部のエンティティを再インデックス化するために使用できるライブラリまたは優れたコード サンプルを知っている人はいますか?

これを自分で実装する場合、MapReduce を考慮する必要がありますか?

「インデックスを再作成する必要がありますか?」多くの開発者が遭遇した問題のように感じますが、私が見つけることができる最も近いものはこれです。

他のオプションは、データストアの名前空間とエンティティを反復処理するタスク キューを使用する自作のソリューションですが、車輪を再発明して堅牢で実証済みのソリューションを使用することは避けたいと思います。

オプションは何ですか ?

4

1 に答える 1

2

残念ながら、事前に構築されたシステムについては知りません。基本的に、すべてのエンティティを反復処理するカーソルを作成し、それらすべてに対して get と put を実行する必要があると思います (または、必要に応じて、put を実行する前にそれらがインデックスにあるかどうかを確認します。更新する必要はありません。これにより、読み取りや小さな操作を犠牲にして書き込みを節約できます)。

ここの例に従ってください: https://code.google.com/p/objectify-appengine/wiki/IntroductionToObjectify#Cursors

  1. データストア キーのバッチを保持する java.util.concurrent.SynchronousQueue を作成します。
  2. ThreadManager: https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/ThreadManagerを使用して、10 個の新しいコンシューマー スレッド (現在の制限) を作成 します。
    1. 新しい objectify インスタンスを作成し、objectify のセッション キャッシュと memcache をオフにします。
    2. SynchronousQueue からキーのバッチを取得します。
    3. バッチ get を使用して、これらのエンティティをすべてフェッチします。
    4. 必要に応じて、関連するプロパティを使用して、これらすべてのエンティティに対してキーのみのクエリを実行します。
    5. これらすべてのエンティティを配置します (または上記で返されたエンティティを除外します)
    6. 手順 2 から繰り返します。
  3. ループで、キーのみのカーソル クエリを使用して次の 30 個のキーをフェッチし、それらを SynchronousQueue に入れます。
  4. すべての項目を SynchronousQueue に入れたら、すべてのコンシューマ スレッドが作業を完了したら停止するようにプロパティを設定します。
于 2013-03-13T12:45:35.940 に答える