Google App Engine Datastoreのエンティティで一括更新を実行する適切な方法は何ですか?エンティティを取得する必要なく完了できますか?Google App Engine Datastoreの一括更新
例えば、何がSQLでこのような何かにGAEのequivilant次のようになります。
UPDATE dbo.authors
SET city = replace(city, 'Salt', 'Olympic')
WHERE city LIKE 'Salt%';
Google App Engine Datastoreのエンティティで一括更新を実行する適切な方法は何ですか?エンティティを取得する必要なく完了できますか?Google App Engine Datastoreの一括更新
例えば、何がSQLでこのような何かにGAEのequivilant次のようになります。
UPDATE dbo.authors
SET city = replace(city, 'Salt', 'Olympic')
WHERE city LIKE 'Salt%';
、クエリのクラスを使用することができます。データストアには実際に更新の概念がありません。古いエンティティを同じアドレス(キー)の新しいエンティティで上書きするだけで済みます。エンティティを変更するには、データストアからフェッチし、ローカルに変更してから元に戻す必要があります。
LIKE演算子に相当するものもありません。ワイルドカードのサフィックスマッチングはいくつかのトリックでは可能ですが、 '%Salt%'と一致させたい場合は、すべての単一のエンティティをメモリに読み込んで文字列比較をローカルで行う必要があります。
したがって、SQLほどきれいで効率的ではありません。これは、ほとんどの分散オブジェクトストアとのトレードオフであり、データストアも例外ではありません。
つまり、the mapper libraryは、このようなバッチ更新を容易にするために利用できます。例に従うと、あなたのprocess
機能のために、このようなものを使用します。
def process(entity):
if entity.city.startswith('Salt'):
entity.city = entity.city.replace('Salt', 'Olympic')
yield op.db.Put(entity)
マッパ以外にも選択肢があります。最も重要な最適化のヒントは、更新プログラムをバッチすることです。更新された各エンティティを個別に保存しないでください。マッパーとyield putを使用すると、これは自動的に処理されます。
あなたは直接の翻訳がありませんhttp://code.google.com/appengine/docs/python/datastore/queryclass.html
query = authors.all().filter('city >', 'Salt').fetch()
for record in query:
record.city = record.city.replace('Salt','Olympic')
ありがとうございますが、これはすべてのオブジェクトをメモリに持ち込むのではなく、1000の最大レコード制限にも制限されていますか? – Yarin
いいえ、エンティティを取得せずに行うことはできません。
「1000の最大レコードの上限」というようなことはありませんが、1つのリクエストでタイムアウトが発生します。また、変更するエンティティが大量にある場合は、単純な反復が無効になる可能性があります。これを複数の操作に分割し、query cursorで追跡したり、可能であればMapReduce frameworkを使用して追跡して管理できます。
ダニエルは感謝しています...ある時点でレコードの上限が最大であったと誓っていたでしょうか? – Yarin
私の場合は、「タイムアウト」自体は得られませんでした。特定のエラーが発生しました。「この要求を処理する際に、この要求を処理したプロセスがメモリを使いすぎて終了しました。」 –
MapReduceが少なくとも "大量のメモリ"(別名**大**)と "タイムアウト"(別名** long-running **)の問題を少なくとも「両方」解決するように設計されていることを強調する。単一の要求の範囲内で処理できない大規模で長時間実行されるジョブの場合、 '](https://github.com/GoogleCloudPlatform/appengine-mapreduce/wiki/1-MapReduce)のようなタスクは、 –
Drew-マッパ参照のために非常に感謝します。私が学びたいと思うもののように見えます。 – Yarin