¿Qué tan eficiente es Google App Engine ndb.delete_multi ()?

Estoy trabajando en algo para borrar mi base de datos de ~ 10,000 entidades, y mi plan es ponerlo en una tarea que elimine 200 a la vez usando ndb.delete_multi() y luego se vuelva a llamar de forma recursiva hasta que no quede ninguna entidad.

Por ahora, todavía no tengo la recursión, así que podría ejecutar el código varias veces manualmente y verificar errores, uso de cuotas, etc. El código es:

 entities = MyModel.query_all(ndb.Key('MyModel', '*defaultMyModel')).fetch(200) key_list = ndb.put_multi(entities) ndb.delete_multi(key_list) 

Todo lo que hace query_all() es consultar MyModel y devolver todo.

He hecho algunas pruebas comentando cosas y ejecutando el método, y parece que las dos primeras líneas ocupan la cantidad esperada de escrituras (~ 200).

Ejecutar la tercera línea, ndb.delete_multi() , ocupa aproximadamente el 8% de mi permiso diario de escritura de 50,000, así que aproximadamente 4000 escrituras, 20 veces más de lo que creo que debería estar haciendo.

También me he asegurado de que la lista de claves contenga solo 200 claves con el registro.

¿Alguna idea sobre por qué esto ocupa tantos escritos? ¿Estoy usando el método equivocado? ¿O simplemente usa un montón de memoria? En ese caso, ¿hay alguna manera para que pueda hacer esto de manera más eficiente?

Gracias.

Su ejemplo de código es extremadamente ineficiente. Si está eliminando un gran número de entidades de las que necesitará para realizar el proceso por lotes a continuación, pero debe recuperar datos con una consulta keys_only y luego eliminar:

 from google.appengine.ext import ndb ndb.delete_multi( MyModel.query().fetch(keys_only=True) ) 

En lo que respecta al número de operaciones de escritura (ver la respuesta de Andrei), asegúrese de que solo los campos en su modelo que deben ser indexados “tengan un índice habilitado”.

Cuando elimina una entidad, el almacén de datos debe eliminar una entidad y un registro de un índice para cada propiedad indexada, así como para cada índice personalizado. El número de escrituras no depende del método de eliminación que utilice.