特定の種類のすべてのエンティティに対して小さな操作を実行し、それらをデータストアに書き直したいと考えています。現在、この種のエンティティが 20,000 ありますが、任意の量に拡張できるソリューションが必要です。
私のオプションは何ですか?
特定の種類のすべてのエンティティに対して小さな操作を実行し、それらをデータストアに書き直したいと考えています。現在、この種のエンティティが 20,000 ありますが、任意の量に拡張できるソリューションが必要です。
私のオプションは何ですか?
マッパーを使用します- これは MapReduce フレームワークの一部ですが、必要なのは最初のコンポーネントである map のみです。データストア エンティティを単純に変更する場合は、シャッフル/削減のステップは必要ありません。
ダニエルは正しいですが、マッパーを台無しにしたくない場合は、アプリに別のライブラリを追加する必要があります。タスク キューを使用するか、SDK 1.2.3 以降に含まれている遅延ライブラリを使用してさらに簡単に行うことができます。 .
20.000 エンティティはそれほど劇的ではなく、このタスクが定期的に実行されることはないと思います (ただし、実行されたとしても実行可能です)。
NDBと遅延ライブラリを使用した例を次に示します (DB を使用して簡単に実行できますが、まだ使用していない場合は NDB に切り替えることを検討してください)。これは非常に簡単な方法ですが、タイムアウトについてはあまり気にしません。
def update_model(limit=1000):
more_cursor = None
more = True
while more:
model_dbs, more_cursor, more = Model.query().fetch_page(limit, start_cursor=more_cursor)
for model_db in model_dbs:
model_db.updated = True
ndb.put_multi(model_dbs)
logging.info('### %d entities were updated' % len(model_dbs))
class UpdateModelHandler(webapp2.RequestHandler):
def get(self):
deferred.defer(update_model, _queue='queue')
self.response.headers['Content-Type'] = 'text/html'
self.response.out.write('The task has been started!')