Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
ich hab mal wieder eine Frage die mich beschäftigt.
Und zwar hab ich ein Programm geschrieben welches mir diverse Daten sammelt & speichert(Tages&Monatsweise) die Tagesdatei ausließt und über einen XY-Graph ausgibt. Die Daten werden über Globale Variablen und eine Masskarte(PCI-6221) gesammelt.
Jetzt hab ich festgestellt, dass die CPU-auslastung bei ca. 40% liegt. Leider steigt die Auslastung kontinuierlich an. Sogar soweit, dass die Auslastung scheinbar bei dauerhaft 100% liegt. Was dann irgendwann dazu führt, dass die CPU zu heiß wird und der Computer stoppt. Ich denke eine ausreichende Kühlung ist in der Halle gegeben da dort Luftkühlung vorhanden ist.
Ich hab mal geschaut und habe mir mal die VI Properties->Memory Usage angeschaut und da wird unter dem Punkt Data ca. 53MB angezeigt. Allerdings sind die Messfiles(Tages&Monatsfiles) zusammen nur ca.4.5MB groß.
Nun zu meiner Frage wieso ist das so ? Ich kann mir das so gar nicht erklären. Mir ist bewusst, dass man das Programm wahrscheinlich besser hätte Programmieren können aber ich denke es ist mir unter Zuhilfenahme der Kompetenz dieses Forum ganz gut gelungen.
Es währe super wenn mir jemand helfen könnte. Die CPU&SpeicherLast ein klein wenig zu senken. Oder ist die Auslastung für ein solches Programm normal? Bzw. generell mal erklärt wo ich da eventuelle Fehlprogrammierungen habe.
Ach ja ich hänge das Programm und einen Screenshot mal an.
Ich möchte die Herren über dieses Forum bitten sollte ich das Thema an die falsche stelle geschrieben zu haben verschiebt das Thema doch an die richtige Stelle.
Vielen Dank schon mal.
Grüße aus Mainz
Jürgen
Anzeige
14.02.2012, 09:25 (Dieser Beitrag wurde zuletzt bearbeitet: 14.02.2012 09:30 von GerdW.)
erstmal bitte das VI aufräumen und die ganzen RubeGoldbergs entfernen:
- man muss nicht gleichzeitig ins Terminal und in eine lokale Variable eines Indicators schreiben
- es gibt Funktionen zum Zusammensetzen von Pfaden, man muss das nicht mit Strings erledigen
- es gibt effizientere Stringformatierungsfunktionen, man muss keine ConcatStrings mit +20 Eingängen verwenden (bzw. kann selbst mal ein paar Leerzeichen schreiben, statt extra Konstanten zu verdrahten)
Dann:
Wenn ich ein VI sehe, dass schon über ein 1MB groß ist, weiß ich schon vorher, dass da mit sehr großer Wahrscheinlichkeit ExpressVIs drin sind. ExpressVIs sind zwar "nett", aber nicht immer für lang laufende VIs geeignet! Vor allen Dingen, wie du sie einsetzt:
- zum Aufsplitten von "Signalen", die als Array of Waveforms vorliegen, kann man auch ein einfaches IndexArray verwenden
- zum Berechnen eines gleitenden Mittelwerts gibt es auch Funktionen in der Signalverarbeitungspalette (hier könnte sich ein Speichergrab verstecken, dass du auch gleich noch mehrfach aufrufst/aufmachst)
- zum Zusammensetzen von Plots schaut man in die Kontexthilfe und verwendet BuildArray
Mach bitte alle diese Änderungen und teste dein VI dann noch mal.
Außerdem überlege dir, ob du wirklich dauernd Dateien schreiben und lesen willst, oder ob es nicht vielleicht doch effizienter ist, ein paar Daten im RAM zu halten...
Ich hab versucht die Punkte die du bemängelt hast umzusetzen. Nur sind mir ein paar dinge nicht klar.
Bei dem verändern des Programmes ist keinerlei Funktionalität verloren gegangen nur die größe ist von 1.05MB auf ca 300KB geschrumpft was ich ziemlich krass finde und ich auch nicht gedacht hätte.
1.Das mit den Terminals und den lokalen variablen hab ich jetzt mit Refenzen und Typumwandlung umgesetzt da kann man bestimmt auch noch was ändern oder ?
2./3. Das mit den Pfaden und der Stringformatierung ist mir nicht ganz klar wie Du das genau meinst. Um Ehrlich zu sein.
4./5. Das mit den Express VI's war mir bewusst nur ist mir keine andere aus meiner Sicht sinnvolle Lösung eingefallen. Aber in dem neuen Programm habe ich die Vi's ersetzt. Das mit den gleitenden Mittelwerten hat sich auch erledigt da wir Hardwarefilter in unseren Aufbau einbauen werden.
6. Das mit dem Build array ist mir nicht ganz klar was dabei der vorteil ist. Denn ob ich die Strings zu einem String zusammenführe oder zu einem Array mach aus meinem Wissenstand keinen unterschied. Aus diesem Grund bitte um Aufklärung.
7. Änderungen so gut es ging durchgeführt
8. Ich habe mich für eine sofortige Speicherung entschieden wg der ausfallsicherheit. Denn sollte der Rechner wie am Wochenende geschehen einfach abstürzen können jede menge Messdaten verloren gehen. Das ist zugegeben im "Idle" Modus kein Problem, aber wenn unser Heliumverflüssiger läuft sind die Messdaten schon sehr wichtig.
Ich habe das Programm nun noch mal mit den durchgeführten veränderungen laufen gelassen und habe festgestellt das ist ich ein massives Problem bei der auslese der Täglichen Messdatei habe. Wenn ich das rausnehme braucht das Programm so gut wie keine CPU-Zeit mehr.
Könntest du mir vielleicht noch einen kleinen Denkanstoß geben wie ich das mit der auslese umsetzte und das auch automatisch täglich die neue Messdatei öffnet?
Ich danke Dir schon und nochmal.
Grüße Jürgen
(14.02.2012 09:25 )GerdW schrieb: Hallo Jürgen,
erstmal bitte das VI aufräumen und die ganzen RubeGoldbergs entfernen:
- man muss nicht gleichzeitig ins Terminal und in eine lokale Variable eines Indicators schreiben
- es gibt Funktionen zum Zusammensetzen von Pfaden, man muss das nicht mit Strings erledigen
- es gibt effizientere Stringformatierungsfunktionen, man muss keine ConcatStrings mit +20 Eingängen verwenden (bzw. kann selbst mal ein >paar Leerzeichen schreiben, statt extra Konstanten zu verdrahten)
Dann:
Wenn ich ein VI sehe, dass schon über ein 1MB groß ist, weiß ich schon vorher, dass da mit sehr großer Wahrscheinlichkeit ExpressVIs drin >sind. ExpressVIs sind zwar "nett", aber nicht immer für lang laufende VIs geeignet! Vor allen Dingen, wie du sie einsetzt:
- zum Aufsplitten von "Signalen", die als Array of Waveforms vorliegen, kann man auch ein einfaches IndexArray verwenden
- zum Berechnen eines gleitenden Mittelwerts gibt es auch Funktionen in der Signalverarbeitungspalette (hier könnte sich ein Speichergrab verstecken, dass du auch gleich noch mehrfach aufrufst/aufmachst)
- zum Zusammensetzen von Plots schaut man in die Kontexthilfe und verwendet BuildArray
Mach bitte alle diese Änderungen und teste dein VI dann noch mal.
Außerdem überlege dir, ob du wirklich dauernd Dateien schreiben und lesen willst, oder ob es nicht vielleicht doch effizienter ist, ein >paar Daten im RAM zu halten...
14.02.2012, 16:34 (Dieser Beitrag wurde zuletzt bearbeitet: 14.02.2012 16:37 von GerdW.)
Zitat:größe ist von 1.05MB auf ca 300KB geschrumpft was ich ziemlich krass finde
Ja, so ist das...
Es ginge aber noch immer mit weniger ExpressVI:
Auch das "Von DDT nach xxx umwandeln" ist ein ExpressVI, ebenso wie das "Signale bündeln"...
Außerdem: wieso liest du ganze Waveforms vom DAQ, wenn du nur Einzelwerte weiterverwenden willst? Lass dir doch gleich Einzelwerte (pro Kanal) liefern, dann ersparst du dir das Umwandeln der Waveforms!
Zitat:Das mit den Terminals und den lokalen variablen hab ich jetzt mit Refenzen und Typumwandlung umgesetzt
Wo? Ich sehe da keine Referenzen und Typumwandlungen... Ahh, jetzt hab ich's gesehen. Was du da machst, ist totaler Blödsinn: du holst dir die Referenz auf ein Objekt und wandelst diese in eine DBL-Zahl um... Du bekommst du alles mögliche heraus, aber garantiert nicht den aktuellen Wert. An dieser Stelle darfst du (vorerst) weiter mit lokalen Variablen arbeiten. Was ich bemängelt hatte, war das parallele Schreiben von Werten ins Terminal und in eine lokale Variable des gleichen Indicators in der mittleren Schleife...
Zitat:Denn ob ich die Strings zu einem String zusammenführe oder zu einem Array
Bei den Strings hatte ich eher an FormatIntoString gedacht. Das BuildArray kann man anstelle des "Signale bündeln" verwenden...
Noch mehr Vorschläge:
- Plot kann man auch in einer Schleife sichtbar schalten (wenn man die Bits vorher mittels BuildArray zusammenfasst):
- Bei IndexArray muss nicht unbedingt die ganzen Indices mit Konstanten verdrahten, das zählt selbständig von 0 an aufwärts...
Ein hervorragendes Tool bei Problemen mit Speicherverbrauch ist der Sysinternals Process Explorer.
Besonders liebe ich hierbei die Möglichkeit, zu sehen, ob Handles hochlaufen, was immer auf nicht geschlossene Referenzen deutet.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
@Jens danke für den hinweis werde ich mal versuchen und schauen was bei raus kommt.
Meine private Erfahrung mit dem Prozess Explorer von Sysinternals ist eher bescheiden, denn ich hatte ihn installiert und dieses Tool hat es geschafft ein Programm komplett lahm zu legen sprich es konnte nicht mehr gestartet werden. Leider kann ich mich gerade nicht mehr daran erinnern welches Programm das war. Allerdings muss ich sagen der AHA-Effekt war gewaltig
Aber nichtsdestotrotz werde ich mal damit schauen.
@Schrotti auch dir ein dank für den hinweis hab die Skalierungen auch schon erstellt und werde Sie wenn ich die "neue" Version meines Programmes online bringe auch gerade umstellen.
ich danke dir immer und immer wieder für deine schnelle Hilfe. Mittlerweile ist ist das Programm noch weiter geschrumpft und zwar auf ca. 190KB. Finde ich einfach klasse und ein wenig erschreckend wie groß diese VI's doch sind.
Ich hab auch die anderen ExpressVI's ausgetauscht und die Funktion ist natürlich noch gegeben. Und das Programm läuft nun mit ca. 10%CPULast bei ca 4.5MB Messdaten.
Außerdem hab ich das einlesen der Tagesmessdatei umgestellt. Und zwar so, dass die Datei am anfang des Programmstarts geladen wird, wenn sie vorhanden ist. Und nach 5 schleifendurchläufen/sec wird auf die interne Datenquelle umgestellt. Dazu habe ich mir ein Array mit Zeitstempel und Messsignalen als dbl's mit bundel und build array erstellt. Das umschalten klappt einwandfrei. Und es kommen auch die Datensätze(Zeit/Signal) an nur scheint es ein Problem mit der Interpretation des Zeitstempels vom XY-Graph zu geben. Irgend wie macht der Graph aus dem richtigen Zeitstempel (über eine Probe abgeglichen) einen zeitraum von 1999 - 2033 oder so ähnlich. Ich hab schon versucht diverse Kombinationen versucht, nur offensichtlich nicht die richtige .
Ich wäre für einen kleinen Hinweis wie ich das Problem gelöst bekomme sehr dankbar.
Ab und an hab ich das Gefühl, dass ich das Programm verstanden hab und dann kommt wieder so was dazu und ich sage zu mir zum Glück kann ich Labview starten
Die Skalierung hat nicht gepasst. Ansonsten habe ich noch ein paar optische Verschönerungen vorgenommen, die du auch auf den XY-Graph übertragen kannst. Einfach Plotlegende und Zahlenanzeige sichtbar machen. Da ersparst du dir ein paar extra Anzeigen.
Das mit der Skalierung müsstest du mir bitte mal erklären das hab ich nicht verstanden. Meinst du die Skalierung des XY-Graphen, des Tagesfiles oder der Internen Datenquelle? Ich hab das Programm gerade mal laufen lassen und habe festgestellt, dass es so leider nicht Funktioniert. Also es passiert das gleiche wie mit der hoch geladenen Version. Tagesfile wird geladen und korrekt angezeigt, dann nach 5Schleifendurchgängen/sec wird die Anzeige geleert und die Zeitachse wird auf den Bereich 8.12.1999 bis 02.12.2023 gestellt und es ist dann auch nichts weiter zu sehen im Graph . Oder verstehe ich deinen ersten Satz mit "Die Skalierung hat nicht gepasst." falsch und du hast mir damit einen Hinweis gegeben, wenn ja musst du mir den kompletten sprichwörtlichen Gartenzaun über den Kopf ziehen *hahaha. Denn was ich dagegen machen kann ist mir nicht klar.
Wieso du für die Casestruktur ein Schieberegister eingebaut hast ist mir dank deines Hinweises "es langt doch, die Ploteigenschaft einmal zu setzen." klar. Macht natürlich Sinn dem Programm einmal zusagen "Jetzt bitte die Aktiv-Ploteigenschaften aktivieren" und das nicht in jedem Schleifendurchlauf auf neue mitzuteilen.
Jetzt wird mir auch klar was Gerd gemeint hat mit Werte in Terminals und lokale Variablen(denke ich) nur leider kann ich die Zahlenwerte für den Graph nicht aktivieren. Ich dachte, dass ich zu "blöd" bin aber mit deinem angehängten Bild kann das gar nicht schief gehen. Deswegen hab ich mal schnell geschaut und gefunden, dass es die Zahlenanzeige nur ein Signalverlaufsdiagramm gibt. Das hier "Zahlenanzeige—Dient zur Anzeige des Zahlenwerts des Diagramms. Diese Option gilt nur für Signalverlaufsdiagramme." stammt direkt von NI. Also muss ich das leider doch so machen wie ich es mache. Oder gibt es einen Trick wie man LV überlisten kann?
Ich danke Dir nochmals. Wenn du mir noch einen kleinen Hinweis geben könntest wie ich das mit dem Einlesen des Messfiles und der Umschaltung auf interne Daten bewerkstelligen kann wäre ich dir sehr dankbar.