2012-06-26 12 views

Respuesta

4

- esto es parte del framework MapReduce, pero solo quiere el primer componente, mapa, ya que no necesita el paso de mezcla/reducción si simplemente está mutando entidades de almacenamiento de datos.

+0

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? –

+0

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 –

3

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!') 
+1

Mi principal preocupación con respecto a este enfoque es llegar al límite de la memoria de la instancia, ya que todos los modelos se almacenan en la memoria antes de escribir (he tenido estos antes) . Es posible hacer que la tarea update_model engendre otra tarea update_model después de un número dado de modelos al pasar un cursor y así sucesivamente. –

+0

@TomerWeller No creo que sea necesario, esta no es una prueba intrusiva y es muy fácil de adoptar en su propia aplicación ... así que pruébelo y díganos – Lipis

+1

"Excedió el límite de memoria privada suave con 155.32 MB después del servicio, 1 solicitud total ". Tengo 18,000 entidades con un promedio de 10KB por entidad. Se trata de un error esperado, ya que la instancia de interfaz básica tiene 128 MB de memoria y estoy tratando de cargar 180 MB de datos. Es bueno de appengine dejarme llegar a 155 :) –

Cuestiones relacionadas