Conan der Barbar Posted October 16, 2019 at 02:17 PM Share Posted October 16, 2019 at 02:17 PM Hallo, Ich hab das Forum schon durchsucht und nichts gefunden. Ich verwende einen Red Brick, eine Power Supply, zwei Master 2.0, 1 solid Stare relais und 7 PTC-bricklets 2.0. Mein Problem ist, dass der TinkerForge Red Brick mit meinem Python Programm überfordert ist. Die CPU ist immer zu 100% ausgelastet und die Temperaturen werden zeitverzögert ausgelesen. Hat jemand eine Idee, wie ich das Python Programm schneller bekomme, bspw. Als stand alone. Ich habe schon Versucht eine stand alone Python Programm hochzuladen und zu starten, aber es ließ sich auf dem TinkerForge nicht starten, auf meinem Linux PC jedoch schon. Als stand alone hätte ich natürlich auch keinen Zugriff mehr über den brickviewer auf das Programm. Habe es auch Versucht mit alternativen Compilern, aber alle auf dem TinkerForge nicht zum laufen bekommen. Ich hoffe jemand kann mir helfen, vielen Dank schon mal im voraus. Conan der Barbar Quote Link to comment Share on other sites More sharing options...
photron Posted October 16, 2019 at 07:14 PM Share Posted October 16, 2019 at 07:14 PM So ins Blaue antworten ist schwer. Zeig doch mal dein Python Programm vor. Quote Link to comment Share on other sites More sharing options...
Conan der Barbar Posted October 17, 2019 at 08:07 AM Author Share Posted October 17, 2019 at 08:07 AM Das Programm ist knapp 2000 Zeilen lang. Zudem ist es Teil einer Abschlussarbeit, die unter Verschluss steht. Darf also nicht einfach originalcode hochladen. Wüsste allerdings auch nicht wie ich bei 2000 Zeilen einen Beispielcode hochladen sollte. Quote Link to comment Share on other sites More sharing options...
photron Posted October 17, 2019 at 09:37 AM Share Posted October 17, 2019 at 09:37 AM Okay, dann kannst du dein Programm mit einem Profiler betrachten, um zu sehen wo das Programm seine Zeit verbringt: https://docs.python.org/3.7/library/profile.html Das erste wo nach ich im Code schauen würde, ist ob du Schleifen hast, die irgendetwas viel häufiger tun als sie müssten: Nach diesem Muster z.B.: while True: ptc_bricklet.get_temperature() Der Code fragt mit voller Geschwindigkeit die Temperatur ab, mehrere tausende male pro Sekunde. So schnell ändert sich die Temperatur aber nicht. Es würde auch vollständig reichen die Temperatur nur jede Sekunden anzufragen: while True: ptc_bricklet.get_temperature() time.sleep(1) Das spart enorm CPU Last. Quote Link to comment Share on other sites More sharing options...
Conan der Barbar Posted October 17, 2019 at 10:28 AM Author Share Posted October 17, 2019 at 10:28 AM Hallo, ich habe keine schleifen drinne, genau wegen so etwas wie du es eben beschrieben hast. ich frage die temperatur regelmäßig ab, mit der callbackfunktion von TF. Auch auf sleep verzichte ich, da die programmoberfläche dann ins stocken kommt. Andere Werte von denen ich regelmäsig ein update brauche hohle ich mir mit eine selbst gebastelten callbackfunktion mit QTimer von PyQT5. Bei den Temperaturwerten ist es so, dass das kleinste Zeitintervall in dem ich die 7 Werte nacheinander abfragen kann, 30 sekunden ist, da ansonsten der alte Wert mit einem Neuen überschrieben wird, bevor ich den alten abspeichern kann. Das wäre auch noch erwähnenswert: Es gibt eine graphische Oberfläche mit PyQT5, und abspeichern tue ich die Werte in einer SQLite Datenbank. Das vollständige Auslasten der CPU hat erst angefangen, als ich mein Programm um die SQLite Datenbank erweitert habe und ein regelmäßiges An- und Ausschalten des Solid State Relais programmiert habe. Ich dachte zuerst es liegt an der SQLite-Datenbank, aber die ist ja gerade dafür konzipiert, auf einem System mit wenig Anspruch zu laufen und auch laut meinem Betreuer, kann es nicht daran liegen. Ich kann mir aber auch nicht vorstellen, dass es an dem Relais liegen kann, da das eigentlich nicht so viel macht, auser in in einem bestimmten Tackt an und aus zu gehen. Aber in jedem Fall schonmal Danke dafür, dass du versuchst mir zu helfen. Ich weis echt nicht mehr weiter.. Quote Link to comment Share on other sites More sharing options...
photron Posted October 17, 2019 at 04:26 PM Share Posted October 17, 2019 at 04:26 PM Okay, wenn du also schon weißt, dass es vor dem Hinzufügen von SQLite und dem Solid State Relay besser war, dann sollte es nicht so schwer sein das Problem zu finden. Hast du deinen Code unter Versionskontrolle (git, svn, hg ...)? Sprich hast du noch eine alte Version deines Programs, bevor das Problem aufgetreten ist? Dann teste diese alte Version jetzt noch mal, nur um sicher zu gehen, dass das Problem durch Änderungen an deinem Programm entstanden ist und nicht durch irgendetwas anderes was sich in der Zwischenzeit geändert hat. Wenn das Problem in deinem Programm ist, dann sollte die alte Version jetzt auch noch gut laufen. Wenn eine alte Version des Programm besser läuft, dann muss es an etwas liegen, dass du in deinem Programm geändert hast. Es mag an SQLite liegen, auch wenn dein Betreuer das für unwahrscheinlich hält. Solange du nicht beweisen kannst, dass SQLite nicht das Problem ist, solltest du das nicht einfach so ausschließen. Es man nicht SQLite im allgemeinen sein, aber vielleicht verwendest du SQLite in einer ungünstigen Weise. Das kannst du testen in dem du in deinem Programm den SQLite Teil mal totlegst, bzw. den Solid State Relay Teil. Damit solltest du herausfinden können wo das Problem entsteht. Du baust im Prinzip eine alte schnelle Version des Programms Schritt für Schritt auf die aktuelle langsame Version um und testet nach jedem Schritt. Auf dem Weg solltest du das Problem finden. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.