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!
Hallo Zusammen, ich weiß der Betreff klingt für viele abgedroschen und nach wenig von mir investierter Zeit. Keine Angst das ist nicht der Fall
Ich habe zyklische Messdaten von X Messteilnehmern, jeder Messteilnehmer hat 2 Module das mir je ein 1 x 78 Array liefert. Das möchte ich in ein 3D-Array sortieren. Ich habe des öfteren gelesen, man soll 3D Arrays vermeiden. Ich finde das aber sehr praktisch und auch übersichtlich für meine Anwendung. Gerade weil ich die Daten später noch in einem Graph zur Laufzeit auswählen und darstellen möchte. Hier meine Fragen:
- Was ist an dem 3D Array der Nachteil und was wäre denn der Vorschlag von den Profis?
- Kann mir jemand helfen warum die Sortierung einfach nicht will?
- Ist das von mir gedachte 3D Array überhaupt eine gute Vorbereitung für die Darstellung in einem Graphen und die Abspeicherung als CSV?
- Insert into Array ist anscheinend auch nicht von Vorteil. Wie aber sortiere ich dann am besten noch das 1 x 78 Array nach der Zellnummer von der niedrigsten Zelle, zur höchsten Zelle? Hat hier jemand einen Vorschlag.
Anbei das Minimalbeispiel. Zur Information, die Messsdaten werden über eine queued state machine zyklisch abgefragt und sollen dann direkt in das 3D Array einsortiert werden. Das tut aber für die reine Sortierung nichts zur Sache. Ich habe, um die zyklischen Messdaten zu simulieren, ein 100 x 78 Array als Inputdata in meinem Minimalbeispiel. Die Sortierung nach Zellnummer habe ich im Minimalbeispiel noch nicht probiert (weil noch kein Funkte ) ... .
3D-Array, schön und gut, aber in deinem Bsp verwendest du ein 4D-Array?! Wozu denn das?
Die Gefahr bei solch hochdimensionalen Arrays ist, das unnötig Speicherplatz verschwendet wird, da alle Zeilen, Spalten, Seiten etc. dieselbe Größe haben müssen!
Deine Datenstruktur "[Messwerte 1&2] [Zelle] [Modul] [Time] [ID Master]", die du im BD beschreibst, schreit nach einem typdefinierten Cluster mit den passenden Datentypen anstatt nach einem "Array of String".
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!
also ich habe jetzt die Messdaten für ein Modul von einem Messteilnehmer in ein Typedef gepackt. Das sieht schonmal super aus, weil die Daten vorab auch schon sortiert werden. Aber das sortieren in die Messdaten(tabelle?) kriege ich einfach nicht gebacken. Was du genau mit einem "typdefinierten Cluster mit den passenden Datentypen" habe ich nicht verstanden. Bis jetzt habe ich nur mit Typedefs gearbeitet. Ich habe meinen neuen Versuch mal anbei gehängt. In der Messdatenkonstante sind Fake-Messdaten von zwei unterschiedlichen ID's welche ich jetzt in ein 2D Array verschachteln würde. Dabei gibt die ID die Seite und das Modul (1 oder 2) die zweite Dimension an. Spart denke ich schon mal Speicherplatz.
Jedoch bekomme ich meine Sortierung weder mit "index array" noch mit "insert into array" hin??????
Das mit dem Cluster als TypDef hast du schon richtig gemacht, so in der Art meinte ich das. Aber wieso muss jedes Element hier ein String sein, auch wenn es eigentlich Zahlen sind?
Ich habe aber immer noch nicht verstanden, was du jetzt wo einsortieren willst.
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!
ich habe mein Vorhaben mal graphisch dargestellt. Hoffe jetzt ist es verständlich.
Warum ich Strings verwende? Weil ich gerne für alle Werte im Typedef das gleich Format hätte und das mit dem Sting am "einfachsten" für den Timestamp war. Aber fest halten muss ich daran nicht. Bei meinen jetzigen Überlegungen habe ich immer im Hinterkopf, dass ich die Messwerte dann als CSV abspeichern möchte (1 CSV pro Messteilnehmer) und das ich das ganze zur Laufzeit darstellen möchte, gerade mache ich das exemplarisch für den ersten Messwert mit einem Waveformgraph und wandle den String wieder zu einem Timestamp um. Weiß nicht wie sehr das die Laufzeit beeinträchtigt oder ob ich den Datentyp Timestamp unverändert lasse und die Integers auch ... (?) Dazu habe ich zu wenig Erfahrung mit so vielen Messdaten.
Dein 3D-Array überzeugt mich weiterhin nicht. Wie viele Datensätze willst du im Speicher vorhalten?
Wenn ich dich bisher richtig verstanden habe, dann bekommst immer von einer bestimmten ID/Modul-Kombination einen neuen Datensatz. Problem dabei: Den hängst du jetzt auf Seite "ID", Spalte "Modul" in einer neuen Zeile dran. Zwecks 3D-Array wird dadurch aber auf jeder Seite & Spalte eine neue Zeile angefügt. Den nächsten Datensatz, den du bekommst, musst du also nicht anfügen, sondern in der passenden Kombination Seite/Spalte/Zeile ersetzen (wenn er denselben Zeitstempel hat die der Datensatz davor). Da wirst du IMHO nicht glücklich mit werden. Ganz unübersichtlich wird es, wenn du von verschiedenen Messteilnehmern die Daten in unterschiedlichen Zeitabständen bekommst.
Dann lieber ein Arry of Cluster of Array of Cluster of Array...
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!
(07.04.2016 11:40 )jg schrieb: Dein 3D-Array überzeugt mich weiterhin nicht. Wie viele Datensätze willst du im Speicher vorhalten?
-> Soviel wie geht (haha ...). Aber im Ernst, es soll schon über 8h 3600/h mal pro Messteilnehmer sein. (Ein Messteilnehmer sind zwei solche Typedefs)
(07.04.2016 11:40 )jg schrieb: Wenn ich dich bisher richtig verstanden habe, dann bekommst immer von einer bestimmten ID/Modul-Kombination einen neuen Datensatz. Problem dabei: Den hängst du jetzt auf Seite "ID", Spalte "Modul" in einer neuen Zeile dran. Zwecks 3D-Array wird dadurch aber auf jeder Seite & Spalte eine neue Zeile angefügt. Den nächsten Datensatz, den du bekommst, musst du also nicht anfügen, sondern in der passenden Kombination Seite/Spalte/Zeile ersetzen (wenn er denselben Zeitstempel hat die der Datensatz davor). Da wirst du IMHO nicht glücklich mit werden. Ganz unübersichtlich wird es, wenn du von verschiedenen Messteilnehmern die Daten in unterschiedlichen Zeitabständen bekommst.
-> Ich kriege immer die Daten die im Typedef angegeben sind (13x[Messwert1 und 2 + Timestamp] + 1x[MessslaveID + LTCModul)]. Es werden immer alle Messteilnehmer abgefragt, sprich nach einem Messdurchgang (=Jeder Teilnehmer schickt einmal seine Daten) -> ist der Datensatz immer gleich lang. Ich hab die ganze Sache jetzt auf ein 2D-Array reduziert (Siehe .jpg). Jedoch wird meine Abtastrate der Messteilnehmer mit steigender Arraygröße immer langsamer. Konkret, bei zwei Messteilnehmern bricht Labview nach dem Messdurchlauf 7000+ mit der Fehlermeldung "DAbort 0xF50EFD7B in MemoryManager.cpp" ab. Ich deute das als überlaufen eines lokalen Speichers wegen zu großem Array. Das sagt mir ich muss was an meiner Datenstruktur ändern.
(07.04.2016 11:40 )jg schrieb: Dann lieber ein Arry of Cluster of Array of Cluster of Array...
-> Kannst du mir dazu ein Beispiel nennen. Mit der Konstruktion komme ich gerade nicht klar. Kann man abschätzen wie viel mehr Daten ich dadurch speichern kann? Gibt es noch weitere Möglichkeiten "Big-Data" zu sammeln? Z.b. zwischenspeichern in einer Datei?
Zitat: Konkret, bei zwei Messteilnehmern bricht Labview nach dem Messdurchlauf 7000+ mit der Fehlermeldung "DAbort 0xF50EFD7B in MemoryManager.cpp" ab.
Hast Du Dir schon mal über eine Datenbankanwendung Gedanken gemacht?
Die Daten sollen doch irgendwann ausgewertet werden. Da würde ich schon lange mit einer SQL Datenbank operieren.
Du kannst ja mal selber hochrechnen: 86400 * 512 Datensätze willst du in RAM halten, jeder Datensatz braucht mal locker 200 Byte, wenn nicht sogar mehr. Und wenn du dauernd dein Array vergrößerst, dann ist schnell der Speicher voll. Nicht vergessen, LabVIEW alloziert für ein Array immer zusammenhängenden Speicherbereich.
Ich empfehle ebenfalls eine Datenbank als Speicherung für so viele Daten. Alternativ musst du halt jede so jede Minute deine Daten an die bestehenden csv Files anhängen.
Dann noch zu meinem Vorschlag der Datenstruktur, das ist so gemeint: Oberste Ebene 1D-Array. Jedes Array-Element ist ein Cluster. Der Cluster entspricht dem Messgerät (ID) und enthält z.B. wieder ein Array (die beiden Module). Die Array-Elemente sind wieder Cluster. Etc. pp. Wie genau du es aufbaust, das liegt bei dir, es muss auch nicht so kompliziert sein. Vorteil bei einem Array of Cluster of Array gegenüber einem 2D-Array: die beiden 1D-Array im Cluster müssen nicht mehr dieselbe Größe haben.
Insgesamt wird das aber nicht wesentlich weniger Speicher als dein 3D-Array brauchen.
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!