2012-10-01 71 views
14

Esto es de la django docs on the queryset iterator() method:a utilizar o no iterador() en el ORM de Django

Un QuerySet normalmente almacena sus resultados internamente de modo que las repetidas evaluaciones no se obtienen en consultas adicionales. Por el contrario, el iterador() leerá los resultados directamente, sin hacer ningún almacenamiento en caché en el nivel QuerySet (internamente, el iterador defectuoso llama al iterador() y almacena en caché el valor de retorno). Para un QuerySet que devuelve una gran cantidad de objetos a los que solo necesita acceder una vez, , esto puede dar como resultado un mejor rendimiento y una reducción significativa en la memoria.

Después de leer, todavía estoy confundido: la línea sobre el aumento del rendimiento y la reducción de la memoria sugiere que deberíamos usar el método iterator(). ¿Alguien puede dar algunos ejemplos de buenos y malos casos iterator() uso?

Incluso si los resultados de la consulta no están en caché, si realmente deseaban acceder a los modelos más de una vez, ¿alguien no puede hacer lo siguiente?

saved_queries = list(Model.objects.all().iterator()) 
+0

Creo que es una cuestión de tamaño de modelo ... si es enorme, entonces probablemente no quiere un manojo en la memoria ... –

Respuesta

23

Nota la primera parte de la frase a llamarte: For a QuerySet which returns a large number of objects that you only need to access once

Así lo contrario de esto es: si tiene que volver a utilizar un conjunto de resultados, y no son tan numerosos como para causar un problema de memoria, entonces no debe usar iterator. Debido a que la base de datos adicional de ida y vuelta es , siempre va a reducir su rendimiento en comparación con el uso del resultado en caché.

Se podría forzar a su QuerySet a ser evaluados en una lista, pero:

  • se requiere más a escribir que sólo saved_queries = Model.objects.all()
  • que usted está paginar resultados en una página Web: se le han obligado a todos los resultados en memoria (de vuelta a posibles problemas de memoria) en lugar de permitir que el paginador siguiente seleccione la porción de 20 resultados que necesita
  • QuerySets are lazy, por lo que puede tener un procesador de contexto, por ejemplo, que coloque un QuerySet en el contexto de cada solicitud pero solo se evalúa cuando accede a él en certa en las solicitudes pero si usted ha forzado evaluación que golpe de base de datos ocurre cada petición

El caso típico aplicación web es relativamente pequeños conjuntos de resultados (que tienen que ser entregados a un navegador en el momento oportuno, por lo que la paginación o una se emplea una técnica similar para disminuir el volumen de datos si es necesario), por lo que generalmente el comportamiento estándar QuerySet es lo que desea. Como sin duda sabe, debe llamar al store the QuerySet in a variable para obtener el beneficio del almacenamiento en caché.

Buen uso del iterador: resultados de procesamiento que ocupan una gran cantidad de memoria disponible (muchos objetos pequeños o menos objetos grandes). En mi experiencia, esto a menudo es en los comandos de gestión cuando se hace un procesamiento de datos pesado.

0

Estoy de acuerdo con Steven y me gustaría tenía una observación:

  • "Se requiere más que simplemente escribiendo saved_queries = Model.objects.all()".Sí, lo hace, pero hay una gran diferencia por qué debería usar list (Model.objcts.all()). Permíteme darte un ejemplo, si pones el que está asignado a una variable, ejecutará la consulta y luego la guardará allí, imaginemos que tienes registros de + 1M, por lo que significa que tendrás + 1M de registros en una lista puede o no puede usar inmediatamente después, por lo que recomendaría usar solo como dijo Steven, solo usando Model.objects.all(), porque esto asignado a una variable, no se ejecutará hasta que llame a la variable, guardando usted DB llama.

  • Debe usar prefetch_related() para evitar que realice muchas llamadas en un DB y, por lo tanto, usará la búsqueda inversa django para ayudarlo y le ahorrará muchísimo tiempo.

Cuestiones relacionadas