Pregunta

Estoy tratando de generar 4 thumnails para cada una de aproximadamente 40k imágenes con sorl- miniatura para mi aplicación django. Recorro todos los objetos django con un archivo ImageWithThumbnailsFieldFile y luego llamo a su función generate_thumbnails ().

Esto funciona bien, excepto que después de unos cientos de iteraciones, me quedo sin memoria y mi bucle se bloquea con 'error de memoria'. Dado que sorl-thumbnail usa PIL para generar pulgares, parece ser que PIL no devuelve toda la memoria que utilizó cuando se generó un pulgar.

¿Alguien puede evitar este problema, por ejemplo? ¿Al obligar a PIL a devolver la memoria que ya no necesita?

mi código simplemente se ve así:

all = Picture.objects.all()
for i in all:
    i.image.generate_thumbnails()

La función genera-miniatura comienza aquí , línea 129.

Gracias de antemano por cualquier consejo!

Martin

¿Fue útil?

Solución

Su problema se relaciona con la forma en que Django almacena en caché los resultados de un queryset a medida que los recorre. Django mantiene todos los objetos en la memoria para que la próxima vez que realice una iteración a través del mismo conjunto de consultas no tenga que volver a golpear la base de datos para obtener todos los datos.

Lo que debe hacer es usar iterator () método. Entonces:

all = Picture.objects.all().iterator()
for i in all:
    i.image.generate_thumbnails()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top