Daniel está en lo cierto, pero si no quiere estropear el mapeador, eso requiere que agregue otra biblioteca a su aplicación, puede hacerlo usando Task Queues o incluso más simple usando el deferred library que se incluye desde SDK 1.2 .3.
20,000 entidades no es tan dramático y supongo que esta tarea no se realizará de forma regular (pero incluso si lo hace, es factible).
Aquí hay un ejemplo usando NDB y la biblioteca diferida (puede hacerlo fácilmente usando DB, pero considere cambiar a NDB de todos modos si todavía no lo está usando). Es una manera bastante directa, pero sin preocuparse demasiado por los tiempos de espera:
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!')
Ya estoy usando el framework MapReduce para encauzar estas operaciones parece una buena idea. Mi preocupación es tener muchas muchas operaciones simples put() ejecutándose en paralelo. más allá del problema de rendimiento, me preocupan los tiempos de espera del almacén de datos ya que muchas entidades comparten grupos de entidades. ¿Hay alguna forma de canalizar y aun agregar put() s? –
map-reduce api permite realizar operaciones de almacén de datos por lotes a través de un grupo de mutaciones. http://code.google.com/p/appengine-mapreduce/wiki/GettingStartedInPython –