Domanda

Sto cercando di generare collettivamente 4 thumnails per ciascuna delle circa 40.000 immagini con sorl- thumbnail per la mia app django. Esamino tutti gli oggetti django con un ImageWithThumbnailsFieldFile e quindi chiamo la sua funzione generate_thumbnails ().

Funziona bene, tranne per il fatto che dopo poche centinaia di iterazioni, ho esaurito la memoria e il mio ciclo si arresta in modo anomalo con "errore di memoria". Poiché sorl-thumbnail utilizza PIL per generare i pollici, sembra che PIL non restituisca tutta la memoria utilizzata quando ha generato un pollice.

Qualcuno può evitare questo problema, ad es. costringendo PIL a restituire la memoria di cui non ha più bisogno?

il mio codice ha semplicemente questo aspetto:

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

La funzione generate-thumbnail inizia qui , linea 129.

Grazie in anticipo per qualsiasi consiglio!

Martin

È stato utile?

Soluzione

Il tuo problema riguarda il modo in cui Django memorizza nella cache i risultati di un queryset mentre li attraversi. Django mantiene tutti gli oggetti in memoria in modo che la prossima volta che esegui lo stesso queryset non devi accedere nuovamente al database per ottenere tutti i dati.

Quello che devi fare è usare iteratore () metodo. Quindi:

all = Picture.objects.all().iterator()
for i in all:
    i.image.generate_thumbnails()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top