Django - il rendering di molti modelli usando templatetags è molto lento


2 Answers

Si potrebbe voler provare il caricatore di modelli di memorizzazione nella cache , django.template.loaders.cached.Loader - dovrebbe certamente ridurre la quantità di IO necessaria.

Modifica da aggiungere È necessario prestare attenzione assumendo che solo perché la maggior parte del tempo viene spesa nella fase di rendering del modello, che il conteggio delle query non è da incolpare. Non dimenticare che i set di query sono pigri e, a meno che tu non li stia specificatamente tagliando o iterandoli nella vista, verranno valutati solo quando il modello viene caricato. Direi che ridurre il numero di query tramite un buon uso di select_related e altre tecniche dovrebbe essere un aiuto significativo.

Question

Dimmi, ho una pagina con una galleria fotografica. Ogni miniatura ha per esempio una foto, un paese, un autore e così via. Rendo questi oggetti / widget usando i tag modello (che caricano i modelli specificati) - va in questo modo a causa di DRY (io uso questi oggetti / widget separatamente in punti diversi della pagina).

Ed è molto lento.

Ho eseguito alcuni profili usando django-debug-toolbar:

SQL Queries: default 84.81 ms (147 queries)

Ma:

Total CPU time: 5768.360 msec

Che è troppo lungo per aspettare.

Dopo alcune analisi si è scoperto che il principale colpevole è la tempistica di enginge.

Quando voglio visualizzare ad es. 150 foto, 600 oggetti / widget associati vengono renderizzati tramite modelli. Significa 600 operazioni di I / O o anche di più. Lo spostamento di questi widget sul modello principale risolve il problema, ma non mantiene DRY.

Quindi la mia domanda è come si può evitare un simile comportamento? Essere ASCIUTTO e lento o no-ASCIUTTO e veloce? Preferirei essere ASCIUTTO e veloce ...




Questo potrebbe non essere applicabile a questo particolare problema, ma in alcuni casi mi ha aiutato a usare select_related nelle query. Potrebbe non essere il caso, ma potrebbe ridurre il numero di query.




Ho avuto lo stesso problema, e forse per lo stesso motivo. Ho ottimizzato le prestazioni di un tag modello personalizzato. Il numero di richieste db è sceso da 640 a 2 e il tempo db risultante era inferiore a 20 ms. La mia pagina, tuttavia, era diventata più lenta! 7s -> 10s. Sospiro. Ho provato un caricatore di modello memorizzato nella cache, senza effetto.

Avevo rinunciato, disabilitato la barra degli strumenti debug di django, dopo di che il tempo di risposta è sceso a 1,2 secondi, incredibile !! Nel mio caso, l'enorme tempo di risposta è stato causato solo dalla barra degli strumenti di debug! Un problema correlato può essere trovato qui . Non mi sto immergendo più a fondo in questo problema della barra degli strumenti, poiché stavo pianificando di memorizzare nella cache il tag del modello utilizzando comunque il caching dei frammenti dei modelli. Durante lo sviluppo ho un tempo di risposta di 10 secondi ogni 15 minuti, con cui posso convivere. Comunque, spero che questo aiuti.




Related