Question

J'essaie de générer en bloc 4 colonnes pour chacune des environ 40 000 images avec sorl- vignette pour mon application Django. Je parcours tous les objets django avec un ImageWithThumbnailsFieldFile, puis appelle sa fonction generate_thumbnails ().

Cela fonctionne bien, sauf qu'après quelques centaines d'itérations, je manque de mémoire et ma boucle se bloque avec une «erreur de mémoire». Depuis que sorl-thumbnail utilise PIL pour générer des vignettes, il semble que PIL ne renvoie pas toute la mémoire utilisée lors de la génération d'une vignette.

Est-ce que quelqu'un comment éviter ce problème, par exemple en forçant PIL à restituer 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 generate-thumbnail démarre ici. , ligne 129.

Merci d'avance pour vos conseils!

Martin

Était-ce utile?

La solution

Votre problème concerne la manière dont Django met en cache les résultats d'un ensemble de requêtes lorsque vous les parcourez en boucle. Django conserve tous les objets en mémoire afin que la prochaine fois que vous parcourez le même ensemble de requêtes, vous ne deviez plus frapper la base de données pour obtenir toutes les données.

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

all = Picture.objects.all().iterator()
for i in all:
    i.image.generate_thumbnails()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top