09.08.2013, 08:30
Hallo liebe LabView-Forumler,
ich bin aktuell ein kleines Zusatzprogram zu schreiben, mit dem Daten aus einer Datenbank gelesen und "gekürzt" werden. Das heißt der originale Tabelleninhalt wird hergenommen und es werden mehrere Tabellen mit einer Sortierung nach der Zeit für Daten in 1Minuten-, 15Minuten, 1Stunde-, ... bis zu 1Jahr-Abständen hineingeschrieben. Die Datenbankabfrage und das Sortieren, sowie das erstellen einer neuen Tabelle + hineinschreiben ist überhaupt kein Problem.
Mein Problem liegt allerdings wieder einmal in der Arbeitsspeicherverwaltung. Gleich vornweg, nein ich habe kein Problem damit, dass der Arbeitsspeicher volläuft. Hier habe ich dafür gesorgt, dass geöffnete DB-Referenzen auch wieder geschlossen werden etc., soweit mir nichts entgangen ist. Und ich schreibe Arrays auch nur in Schieberegister, ohne dabei unendlich lange Arrays zu haben. Sollte euch dennoch so ein Fehler auffallen, sagt es mir bitte.
Wo ich den eigentlichen Fehler sehe ist, dass ich mittels der Datenbank-VIs von NI eine Tabelle auslese und dabei die Werte in den Arbeitsspeicher geschrieben werden. Wenn das VI dann durchgelaufen ist und beendet wird, bleiben die Daten allerdings im Arbeitsspeicher liegen. Am Ende des VIs benutze ich sogar die Funktion "Speicherfreigabe anfordern".
Liegt es vielleicht daran, dass die Schieberegister und die Verbindungen die Daten noch enthalten bzw. erhalten bleiben, wenn das VI beendet wird?
Ich habe schon verschiedenste Themen dazu gelesen und in vielen wurde ja immer darauf hingewiesen, woran es liegt, dass der Speicher vollläuft. Nur mein Speicher läuft ja nicht voll in dem Sinne, sondern er wird beim Laden von bspw. ca. 205000 Datensätzen mit jeweils 29 Werten - es resultiert also ein 205000x29-Array - einmalig mit ca. 2,8GB vollgepackt. Dadurch steigt die RAM-Auslastung von 2,5GB auf 5,3GB an und bleibt auch dabei, bis das VI beendet wird. Nur nach dem Ende bleiben die Daten wie gesagt im Arbeitsspeicher erhalten, was so nicht gedacht war.
Das ist für mich halt ein grundlegendes Problem, da auch Tabellen mit mehr Datensätzen sortiert werden sollen und je nach Bedarf eine Tabelle in mehreren Durchläufen abgearbeitet werden muss, da nicht alle Datensätze gleichzeitig in den Arbeitsspeicher (bzw. die max. 4GB möglichen) passen können.
Hier habe ich mal einen kurzen Ausschnitt aus meinem Blockdiagramm:
[attachment=45818]
Zudem habe ich noch beide VIs - welche in LV2012 SP1 programmiert wurden:
[attachment=45820]
Weitere Lösungsversuche:
(1)
In einem Thema wurde erklärt, dass jedes SubVI eine eigene Kopie anlegt. Dadurch, dass das Select Data-VI von NI ein SubVI ist, dachte ich, dass hier vielleicht der Fehler liegt. Also habe ich den Code heraus kopiert und direkt in mein Blockdiagramm eingefügt. Allerdings hat sich damit nichts geändert. Ist das VI beendet bleiben die Daten im Arbeitsspeicher enthalten.
(2)
Ich habe mal gelesen (glaube hier im Forum), dass man das VI mit einem asynchronen Aufruf öffnen soll und am Ende wieder auf die Standardwerte zurücksetzen soll. Das habe ich versucht, allerdings war das Ergebnis nicht von Erfolg gekrönt. Ich habe es allerdings erstmal dabei belassen - sollte das doch der richtige Weg sein, wäre schön, wenn ihr mir das sagen könnten.
Ich hoffe ich konnte euch alles so genau wie möglich beschreiben.
Beste Grüße vom Schü
ich bin aktuell ein kleines Zusatzprogram zu schreiben, mit dem Daten aus einer Datenbank gelesen und "gekürzt" werden. Das heißt der originale Tabelleninhalt wird hergenommen und es werden mehrere Tabellen mit einer Sortierung nach der Zeit für Daten in 1Minuten-, 15Minuten, 1Stunde-, ... bis zu 1Jahr-Abständen hineingeschrieben. Die Datenbankabfrage und das Sortieren, sowie das erstellen einer neuen Tabelle + hineinschreiben ist überhaupt kein Problem.
Mein Problem liegt allerdings wieder einmal in der Arbeitsspeicherverwaltung. Gleich vornweg, nein ich habe kein Problem damit, dass der Arbeitsspeicher volläuft. Hier habe ich dafür gesorgt, dass geöffnete DB-Referenzen auch wieder geschlossen werden etc., soweit mir nichts entgangen ist. Und ich schreibe Arrays auch nur in Schieberegister, ohne dabei unendlich lange Arrays zu haben. Sollte euch dennoch so ein Fehler auffallen, sagt es mir bitte.
Wo ich den eigentlichen Fehler sehe ist, dass ich mittels der Datenbank-VIs von NI eine Tabelle auslese und dabei die Werte in den Arbeitsspeicher geschrieben werden. Wenn das VI dann durchgelaufen ist und beendet wird, bleiben die Daten allerdings im Arbeitsspeicher liegen. Am Ende des VIs benutze ich sogar die Funktion "Speicherfreigabe anfordern".
Liegt es vielleicht daran, dass die Schieberegister und die Verbindungen die Daten noch enthalten bzw. erhalten bleiben, wenn das VI beendet wird?
Ich habe schon verschiedenste Themen dazu gelesen und in vielen wurde ja immer darauf hingewiesen, woran es liegt, dass der Speicher vollläuft. Nur mein Speicher läuft ja nicht voll in dem Sinne, sondern er wird beim Laden von bspw. ca. 205000 Datensätzen mit jeweils 29 Werten - es resultiert also ein 205000x29-Array - einmalig mit ca. 2,8GB vollgepackt. Dadurch steigt die RAM-Auslastung von 2,5GB auf 5,3GB an und bleibt auch dabei, bis das VI beendet wird. Nur nach dem Ende bleiben die Daten wie gesagt im Arbeitsspeicher erhalten, was so nicht gedacht war.
Das ist für mich halt ein grundlegendes Problem, da auch Tabellen mit mehr Datensätzen sortiert werden sollen und je nach Bedarf eine Tabelle in mehreren Durchläufen abgearbeitet werden muss, da nicht alle Datensätze gleichzeitig in den Arbeitsspeicher (bzw. die max. 4GB möglichen) passen können.
Hier habe ich mal einen kurzen Ausschnitt aus meinem Blockdiagramm:
[attachment=45818]
Zudem habe ich noch beide VIs - welche in LV2012 SP1 programmiert wurden:
[attachment=45820]
Weitere Lösungsversuche:
(1)
In einem Thema wurde erklärt, dass jedes SubVI eine eigene Kopie anlegt. Dadurch, dass das Select Data-VI von NI ein SubVI ist, dachte ich, dass hier vielleicht der Fehler liegt. Also habe ich den Code heraus kopiert und direkt in mein Blockdiagramm eingefügt. Allerdings hat sich damit nichts geändert. Ist das VI beendet bleiben die Daten im Arbeitsspeicher enthalten.
(2)
Ich habe mal gelesen (glaube hier im Forum), dass man das VI mit einem asynchronen Aufruf öffnen soll und am Ende wieder auf die Standardwerte zurücksetzen soll. Das habe ich versucht, allerdings war das Ergebnis nicht von Erfolg gekrönt. Ich habe es allerdings erstmal dabei belassen - sollte das doch der richtige Weg sein, wäre schön, wenn ihr mir das sagen könnten.
Ich hoffe ich konnte euch alles so genau wie möglich beschreiben.
Beste Grüße vom Schü