2

J'essaye de générer en vrac 4 thumnails pour chacune des 40k images avec sorl-thumbnail pour mon application django. Je parcoure tous les objets django avec un ImageWithThumbnailsFieldFile, puis appelle sa fonction generate_thumbnails().Génération Django/Python/PIL/vignette en vrac - erreur de mémoire

Cela fonctionne bien, sauf qu'après quelques centaines d'itérations, je n'ai plus de mémoire et ma boucle se bloque avec 'erreur de mémoire'. Étant donné que sorl-thumbnail utilise PIL pour générer des pouces, il semble que PIL ne renvoie pas toute la mémoire utilisée lors de la génération d'un pouce.

Quelqu'un peut-il éviter ce problème, par ex. en forçant PIL à retourner la mémoire dont il n'a plus besoin?

mon code ressemble simplement ceci:

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

La fonction de générer vignettes commence here, ligne 129.

Merci à l'avance pour tout conseil!

Martin

Répondre

4

Votre problème est lié à la façon dont Django met en cache les résultats d'une queryset que vous boucle à travers eux. Django garde tous les objets en mémoire afin que la prochaine fois que vous parcourez le même jeu de requête, vous n'avez plus besoin de toucher la base de données pour obtenir toutes les données.

Ce que vous devez faire est d'utiliser la méthode iterator(). Alors:

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

merci pour la réponse, cela fonctionne comme un charme, je pense que votre code devrait avoir lu: all = Picture.objects..iterator() – Hoff

+0

Mise à jour - Désolé, je l'ai laissé deviner le plus important partie. – sheats