2017-10-21 29 views
0

Je cherche des idées pour améliorer un rapport qui prend jusqu'à 30 minutes à traiter sur le serveur, je travaille actuellement avec Django et MySQL mais s'il y a une solution qui nécessite de changer la langue ou la base de données SQL, suis ouvert à ça. Le rapport dont je parle lit plusieurs fichiers Excel et insère toutes les lignes de ces fichiers dans une table (la table de rapport) avec une plage de 12K à 15K enregistrements, la table a environ 50 colonnes. Cette partie ne prend pas beaucoup de temps.Comment améliorer le temps de traitement d'un rapport (Django/MySQL)?

Une fois que j'ai tous les dossiers sur la table du rapport que je commence à appliquer plusieurs phases de la logique métier, donc je finis avoir quelque chose comme ceci:

def create_report(): 
    business_logic_1() 
    business_logic_2() 
    business_logic_3() 
    business_logic_4() 

Chaque fonction du business_logic_X fait quelque chose de très similaire, il commence par faire un ReportModel.objects.all() puis il applique plusieurs calculs comme vérifier les dates, les quantités, etc. et met à jour l'enregistrement. Comme il s'agit d'une table d'enregistrement de 12 Ko, l'ajout du temps au rapport complet commence rapidement.

La raison pour laquelle je vais plusieurs fonctions séparément et pas tout le traitement en un seul passage c'est parce que la logique de la première fonction doit être complétée ainsi la logique sur les fonctions suivantes fonctionne (ex: La première chose que je sais qui pourrait être optimisé est en quelque sorte la mise en cache de objects.all() au lieu de l'appeler dans chaque fonction, mais je ne suis pas sûr de savoir comment la transmettre à. la fonction suivante sans enregistrer les enregistrements en premier

J'ai déjà optimisé un peu le rapport en utilisant update_fields sur la méthode de sauvegarde des fonctions et cela a sauvé un peu de temps

Ma question est la suivante: existe-t-il une meilleure approche pour ce genre de problème? Django/MySQL est-il la bonne pile pour cela?

+0

Voyons le SQL concerné. –

Répondre

0

Ce qui prend du temps, c'est la logique métier que vous utilisez dans Django. Donc, il fait plusieurs allers-retours entre la base de données et l'application.

Il semble qu'il y ait plusieurs tables impliquées, donc je suggère que vous écrivez votre requête dans SQL brut et une fois que vous avez les résultats, vous obtenez dans l'application, si vous en avez besoin.

L'orm dispose d'une méthode "brute" que vous pouvez utiliser. Ou vous pouvez descendre à un niveau encore plus bas et l'interface avec votre base de données directement.

Si je ne vois pas ce que vous faites, je ne peux pas donner plus de conseils spécifiques