2017-10-21 4 views
0

Ich bin auf der Suche nach Ideen zur Verbesserung eines Berichts, der bis zu 30 Minuten für die Verarbeitung auf dem Server benötigt. Ich arbeite derzeit mit Django und MySQL, aber wenn es eine Lösung gibt, die die Sprache oder SQL-Datenbank ändern muss bin offen dafür.Wie verbessert man eine Berichtverarbeitungszeit (Django/MySQL)?

Der Bericht, über den ich spreche liest mehrere Excel-Dateien und fügt alle Zeilen aus diesen Dateien in eine Tabelle (die Berichtstabelle) mit einem Bereich von 12K bis 15K Datensätze, die Tabelle hat etwa 50 Spalten. Dieser Teil braucht nicht so viel Zeit.

Nachdem ich alle Aufzeichnungen über den Bericht Tabelle I mehrere Phasen der Geschäftslogik beginnen Anwendung, damit ich so etwas wie dieses Ende:

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

Jede Funktion des business_logic_X tut etwas sehr ähnlich, es beginnt mit einer ReportModel.objects.all() und dann wendet es mehrere Berechnungen wie Daten, Mengen, etc. überprüfen und aktualisiert den Datensatz. Da es sich um eine 12K-Datensatztabelle handelt, wird dem gesamten Bericht schnell Zeit hinzugefügt.

Der Grund, warum ich mehrere Funktionen getrennt und keine gesamte Verarbeitung in einem Durchgang gehe, ist, weil die Logik von der ersten Funktion abgeschlossen werden muss, damit die Logik auf den nächsten Funktionen funktioniert (zB die erste Funktion findet alle zugehörigen Datensätze und wendet den gleichen Status für alle von ihnen an.

Das erste Ding, das ich weiß, konnte optimiert werden irgendwie caching das objects.all(), anstatt es in jeder Funktion zu nennen, aber ich bin nicht sicher, wie man es übergibt die nächste Funktion ohne die Datensätze zuerst zu speichern

Ich habe den Bericht bereits ein wenig optimiert, indem ich update_fields für die Speichermethode der Funktionen verwendet habe, und das hat ein wenig Zeit gespart

Meine Frage ist, gibt es einen besseren Ansatz für diese Art von Problem? Ist Django/MySQL der richtige Stack dafür?

+0

Lassen Sie uns die beteiligten SQL sehen. –

Antwort

0

Was Zeit braucht, ist die Geschäftslogik, die Sie in Django machen. So macht es mehrere Rundreisen zwischen der Datenbank und der Anwendung.

Es klingt wie es mehrere Tabellen beteiligt sind, so würde ich vorschlagen, dass Sie Ihre Abfrage in Raw SQL schreiben und sobald Sie die Ergebnisse haben, bekommen Sie das in die Anwendung, wenn Sie es brauchen.

Die ORM hat eine Methode "roh", die Sie verwenden können. Oder Sie können auf eine noch tiefere Ebene zugreifen und direkt mit Ihrer Datenbank interagieren.

Sofern ich nicht mehr sehe, was Sie tun, kann ich keinen konkreteren Rat geben

Verwandte Themen