2009-09-18 20 views
5

Tengo un simple lazo tontoDjango: recorrer un conjunto de consultas sin caché

for alias in models.Alias.objects.all() : 
    alias.update_points() 

pero mirando en el Django queryset parece mantener en torno a un _result_cache de todos los resultados anteriores. Esto es comer Gigs and Gigs de mi máquina y eventualmente todo explota.

¿Cómo puedo tirar todas las cosas que nunca me interesarán?

+0

intenta no usar alias como un nombre de variable - es una palabra clave – uolot

+4

no, alias no es una palabra clave. – u0b34a0f6ae

Respuesta

11

utilizar el método de la queryset iterator() para devolver los modelos en trozos, sin poblar el caché de resultados:

for alias in models.Alias.objects.iterator() : 
    alias.update_points() 
+4

Aún mastica un montón de RAM cuando uso tu llamada. :( –

+1

Es el hecho de que la consulta mysql está almacenada en el búfer que está causando todos los problemas de ram. –

+3

¿Ha intentado establecer el DEPURADOR en False? Consulte http://docs.djangoproject.com/en/dev/faq/models/ # why-is-django-leaking-memory Esto ayudó mucho más que el uso de un iterador :) – pcv

0

Debe considerar guardar los cambios de nuevo a la base de datos.

for alias in models.Alias.objects.all() : 
    alias.update_points() 
    alias.save() 
+1

bien, update_points() llamadas save() –

Cuestiones relacionadas