Handhabung großer Datenstreams
Hi,
bevor ich mich jetzt weiter durch zig Suchseiten wühle, die das nur am Rande behandeln:
Meine Datenquelle ist ein NI Digitizer, der mir als Stream Daten auswerfen soll. Vermutlich wird es darauf hinauslaufen, dass ich die vor einer Weiterverarbeitung erstmal "zwischenspeichern" muss (auf Festplatte, oder eventuell auch per LAN an einen anderen Rechner), da Datenverarbeitung auf dem Messrechner meine erreichbare Samplerate drastisch drückt (und die ist eh schon bei unter einem Fünftel dessen was der Digitizer kann, da die USB Schnittstelle nicht mehr hergibt).
Mein Problem ist daher:
Ich Streame vom Digitizer fortlaufend das Signal auf einem Kanal. Entsprechend erhalte ich jede Sekunde ~8Mb (entsprechend der beim testen maximal stabil erreichbaren Sample Rate von 8M Samples/s) Daten in Paketen von I8 Arrays "unbekannter" Länge (da ich den Buffer des Digitizers immer nach Möglichkeit komplett leere um ein möglichst schnelles Auslesen zu garantieren; vorteilhaft dafür scheint es zu sein möglichst große Pakete zu lesen; die Optimierung läuft anschließend darauf hinaus die Sample Rate so zu wählen, dass der Buffer im Digitizer nicht überläuft; im praktischen Betrieb habe ich dann am Anfang der Messung Arrays konstanter Länge, (da Messung und Daten holen scheints nicht exakt gleichzeitig gestartet werden) und irgendwann den Buffer leer gemacht und dann nur noch Arrays nicht vorhersagbarer Länge. (Meist >100k Werte).
Da das ganze zeitkritisch ist schreibe ich das aktuell wie gesagt einfach stumpf weg. Denke hier kann man auch relativ leicht darauf optimieren keine unnötigen Datenkopien etc. zu erzeugen und das möglichst effizient zu machen.
Das Problem kommt danach: Die Signale müssen anschließend auch noch verarbeitet werden und dazu muss ich das fortlaufende Signal (zumindest stückweise) wieder zusammensetzen und durch verschiedene Filter / Verarbeitungsroutinen jagen. Im besten Fall krieg ich die Datenmenge dadurch auch relativ schnell reduziert (aus den gesamten Datenpunkte interessieren nur Ausschnitte, allerdings müssen die softwareseitig identifiziert werden). Nur muss ich die bis dahin erstmal irgendwie handhaben und sinnvoll im Speicher aufbewahren etc. pp.
Leider (in dem Fall) hat Labview ja Datenfluss, deswegen muss man ja immer aufpassen wenn man kopien vermeiden will. Wie geht man sowas dann am besten an? Daten über eine Queue von A nach B weiterreichen? In dem Zusammenhang: Funktioniert eine Queue als Referenz oder wird in die Queue eine Datenkopie geschrieben?
Im Prinzip denke ich wäre die Queue zumindest organisatorisch die beste Lösung, da die es erlauben sollte sehr schön Datenproduktion und Verarbeitung zu synchronisieren; aber wenn ich da jedes mal kopiere dann dürfte das ja massiv Zeit kosten.
Welche Konzepte sollte man sich vielleicht noch anschauen um sowas möglichst performant (in dem Fall: schnell) zu lösen?
Zitat:Märchen und Geschichten werden erzählt am Lagerfeuer, technischen Fakten werden mitgeteilt (oder so). (Genauso wie Software nicht auf einem Server "herumliegt", die ist dort installiert.)
*Zitat: IchSelbst*
|