Je comparais un ancien script PHP de mien par rapport à la version plus récente, Fanier Django et le PHP One, avec une crèche complète de HTML et tout fonctionnait plus rapidement. Beaucoup plus vite au point que quelque chose doit être faux sur le Django un.
Premier, un contexte: j'ai une page qui croit des rapports de données de vente. Les données peuvent être filtrées par un certain nombre de choses mais sont principalement filtrées par date. Cela rend un peu difficile de le mettre en cache car les possibilités de résultats sont presque infinies. Il y a beaucoup de chiffres et de calculs réalisés, mais il n'a jamais été un problème de manipuler dans PHP. P>
mises à jour: p>
Après quelques tests supplémentaires, rien dans mon point de vue qui cause le ralentissement. Si je suis simplement numérique-crançrant les données et de cracher 5 rangées de HTML rendu, ce n'est pas si lent (encore plus lent que PHP), mais si je rendu beaucoup de données, c'est très lent. P> LI >
Chaque fois que j'ai dirigé un grand rapport (par exemple, toutes les ventes de l'année), l'utilisation de la machine de la machine va à 100%. Je ne sais pas si cela signifie beaucoup. J'utilise mod_python et Apache. Peut-être que le passage à WSGI peut aider? P> LI>
Mes tags de modèle indiquant le processus de sous-totaux / totaux de 0,1 seconde à 1 seconde pour des ensembles vraiment volumineux. Je les appelle environ 6 fois dans le rapport afin qu'ils ne parlent pas comme le plus gros problème. P> Li> ul>
MAINTENANT, j'ai dirigé un profileur Python et est revenu avec ces résultats: p> tokenize.py sort sur le dessus, ce qui peut avoir un sens comme Je fais beaucoup de formatage de nombre. Décimal.py a du sens puisque le rapport est essentiellement des chiffres de 90%. Je n'ai aucune idée de ce que la méthode intégrée Il semble que ce soient les principaux coupables et si je pouvais trouver comment réduire le temps de traitement de ceux-ci, j'aurais une page beaucoup plus rapide. P> Est-ce que quelqu'un a des suggestions sur Comment puis-je commencer à réduire cela? Je ne sais pas vraiment comment je voudrais résoudre ce problème les problèmes de Tokenize / décimal sans simplement les retirer. P> Mise à jour: j'ai rencontré des tests avec / sans filtres sur la plupart des données et les temps de résultat sont venus De même, ce dernier étant un peu plus rapide, mais pas beaucoup à être la cause de la question. Qu'est-ce qui se passe exactement dans tokenize.py? P> p> correspond à code> est que je ne fais aucune regex ou similaire dans mon propre code (quelque chose que Django fait?) La chose la plus proche est que j'utilise iTerTools Ifilter. < / p>
4 Réponses :
Il y a beaucoup de choses à assumer de votre problème car vous n'avez aucun type d'échantillon de code. P>
Voici mes hypothèses: vous utilisez les outils et modèles d'ormes intégrés de Django (c.-à-d. Sales-Data = ModelObj.Objects (). Tous (). Tous ()) et sur le côté PHP, vous traitez avec des requêtes directes SQL et fonctionnent avec une requête_sey. p>
Django fait beaucoup de type de convertissage et de coulée vers des types de données provenant d'une requête de base de données dans l'objet ORM / Model et le gestionnaire associé (objets () par défaut). P>
En PHP, vous contrôlez les conversions et savez exactement comment lancer d'un type de données à un autre, vous économisez du temps d'exécution en fonction de cette question seule. P>
Je recommanderais d'essayer de déplacer une partie de ce numéro de fantaisie Travailler dans la base de données, en particulier si vous effectuez un traitement basé sur les enregistrements - Les bases de données mangent ce type de traitement du petit-déjeuner. Dans Django, vous pouvez envoyer un SQL cru à la base de données: http://docs.djangoproject.com/fr/dev/topics/db/sql/#topics-db-sql p>
J'espère que cela au moins peut vous faire pointer dans la bonne direction ... P>
Merci. Vous avez raison, cela a du sens. Je voyais des requêtes exécutant bien et avec des matières basses, donc je n'ai donc jamais envisagé cela. Le problème est bien sûr que l'ormes est charmante et conserve le code beaucoup plus propre dans des cas comme celle-ci, donc j'aimerais avoir à ne pas avoir à descendre cette route si possible. Le traitement du numéro que je fais n'est pas complexe (ajoutez ces trois chiffres, multipliez-le), puis je les émettons simplement de les émettre à l'aide du | IntCommA et | Floatformat: 2 filtres Django, donc je ne suis pas sûr que ce soit au cœur de la question.
Le problème que vous pouvez rencontrer concernant l'ajout de chiffres, la multiplication des nombres est la quantité d'enregistrements. Si vous conservez le nombre d'enregistrements retournés plus bas, il réduira la mémoire de la mémoire et le temps nécessaire pour traiter ces données. Gardez cela à l'esprit: vous ne pouvez pas faire une application plus rapidement, vous ne pouvez que le faire faire moins de travail.
Malheureusement dans certains cas graves, l'utilisateur souhaite un rapport de données de vente annuelles et je ne peux pas vraiment garder les enregistrements plus bas. .. :)
Je ne pense pas non plus que votre goulot d'étranglement de la performance soit dans le moteur de modèle. Vous pouvez utiliser certaines des minuteries autour des appels clés à votre vue pour essayer de trouver les portions les plus lentes du code Python et d'améliorer à partir de là.
J'ai fait des tests très basiques à l'aide du module Time et il n'y avait rien dans mes tags de visualisation ou de modèle qui dépassaient d'énormes délais de traitement. Encore plus de preuve que le rendu peut être le problème est que si je sélectionne un filtre "totalisant uniquement" pour mon rapport, qui, selon vous, ne montrera que des totaux, il affichera beaucoup plus rapidement. Pour que ma page frappe le premier templatetag pour les sous-totaux, il faut environ 10 secondes lorsque je montre toutes les données.
Pouvez-vous me dire pourquoi je ne devrais pas effectuer de calculs (ajout de base aux numéros de résumage) dans TemplateTags? Après votre message, j'ai en quelque sorte imaginé un moyen plus efficace de faire ce que font mes templateTags, ce qui est un peu utile, mais ils ne sont toujours pas le goulot d'étranglement. Au moins, il va raser quelques secondes de temps de traitement :) merci
Lorsque vous traitez avec de grands ensembles de données, vous pouvez également économiser beaucoup de CPU et de mémoire en utilisant le valsequeryset qui accède aux résultats de la requête plus directement au lieu de créer une instance d'objet de modèle pour chaque ligne du résultat.
Il ressemble un peu à ceci: p>
Dans un tel scénario, la base de données est souvent le goulot d'étranglement. En outre, l'utilisation d'un orj pourrait entraîner des requêtes SQL sous-optimales. P>
Comme certains ont signalé, il n'est pas possible de dire ce que la probem est vraiment, juste avec les informations que vous avez fournies. P>
Je peux juste vous donner des conseils généraux: P>
PS: Juste Fyi, j'avais une fois une vue assez simple qui était très lente. Après avoir installé le Débogou Middleware J'ai vu qu'environ 500! Les requêtes SQL ont été exécutées dans cette vue unique. Il suffit d'utiliser SELECT_Related () a apporté cela à 5 requêtes et la vue effectuée comme prévu. p>
Il est impossible de suggérer quelque chose d'utile sans votre code de vue et votre guidage de profilage.
Alex: Mon point de vue est assez simple. Il tire une liste initiale d'entrées, puis si le rapport est modifié, il ajoute des filtres. C'est vraiment ça. Mon modèle regroupe ensuite le jeu de données en deux sections puis en boucle tout, appelant des templateTags le long du chemin (mais j'ai chronométré les étiquettes de modèle à exécuter dans 0,1 -> 0,5 seconde. Ces modèles sont les sous-totales / totaux du rapport. de sorte que le temps d'exécution est correct sur d'énormes ensembles de données.)
@Bartek: Veuillez ne pas commenter votre propre question. C'est votre question, vous pouvez le mettre à jour pour contenir tous les faits pertinents.
Essayez d'extraire le problème du système de modèles: Écrivez un bit de code autonome pour interroger les enregistrements et imprimer les résultats de manière plus simple mais avec les mêmes données. Si cela est toujours lent, ajoutez-le à la question afin que nous puissions voir ce que vous faites. Si c'est rapide, vous avez un peu réduit le problème sur le problème.