Hallo, ich suche einen Algortihmus oder eine Vorgehensweise wie man eine datenmenge "ausdünnen" kann. Konkret geht es darum, ich habe jede Sekunde einen Log Datensatz den ich in eine Liste Ablege. Interessant ist aber in der auflösung nur der Bereich der ersten 10 Minuten, danach kann die zeitliche Aulösung der Daten gröber werden. Zb. nur noch ein Datensatz alle 2 Sekunden, nach 30 min reicht auch noch ein DS alle 4 Sekunden. Man könne jetzt nach jedem hinzufügen eines neuen Wertes prüfen ob die Liste noch im Schema ist. Aber jede Sekunde die ganze liste durchlaufen will ich auch nicht machen. Implementiert wird das ganze in C# mit Net4.0. Man hat da so nette funktionen in den Listen wie AVG, Min, Max usw. Aber es sollte halt nicht so sehr zu lasten der Performance gehen. Dehalb will ich die Datenmenge auf das nötigste reduzieren. MfG Sebastian
Run Length, Huffman Code/Baum, Zip/LZW, ... Kommt drauf an, wie viel du buffern kannst.
es soll kein komprimieren sein, sondern ich will alte daten loswerden. Daten die läter als 60min sind werden aus der Liste gelöscht. Aber daten die halt älter als 10min sind sollten in der auflösung reduziert werden (Verlustbehaftet -> daten können weg). Da in kurzen zyklen Openreationen wie AVG, MIN, MAX usw aufgerufen werden. Deshalb muss die anzahl der Datensätzt verkleinert werden. -> normal hat man ja in 60min @1s 3600 Datensätzte, ich will aber maximal 1000 Datensätzte im Buffer haben. Der Speicher ist nicht so das Problem. Bei einem Wert merkt man das ja auch nicht, aber wenn 100 Werte mit dem intervall rein kommen, dann merkt man schon einen Performance einbruch. Und der Steigt mit der Datenmenge.
mache doch mehere listen, eine liste für die aktuelle daten, wenn da dann x einträge drin sind, werden die letzten y einträge gelöscht und ein wert davon in die zweite liste eingetragen. mit der 2ten liste passiert dann das gleiche
> Aber daten die halt älter als 10min sind sollten in der auflösung > reduziert werden (Verlustbehaftet -> daten können weg). Warum schiebst du alte Daten nicht in eine Mittelwertbildung? Kannst z.B. 10 Datensätze zu einem ausmitteln, oder auch mit Überlappungen arbeiten, den Mittelwert, Min und Max eines Datensatz-Blocks merken, so wie du es brauchst.
user schrieb: > mache doch mehere listen, Hätt ich jetzt auch gesagt. Mehrstufig arbeiten Liste_1_Sekunde Liste_2_Sekunden Liste_4_Sekunden Kommt ein Datensatz dazu, dann wird er vorne in die Liste_1_Sekunde eingereiht. Dafür fällt hinten aus dieser Liste einer raus. VOn diesen dort herausfallenden Einträgen nimmst du nur jeden 2.ten und stopfst den in die Liste_2_Sekunden hinein. Auch dort fällt für jeden vorne reingestopften hinten wieder einer raus. Und auch dort wieder das gleiche Spiel: du nimmst nur jeden 2.ten und stopfst den wiederrum in die Liste_4_Sekunde rein. mit ein wenig Geduld und Spucke kann man das sogar in einer Klasse so organisieren, dass ein Objekt dieser Klasse das selbsttätig macht, wenn sie nur weiß, welches andere Objekt ihm nachgeschaltet ist.
Jop, eine Klasse die beim hinzufügen eines Wertes die Liste "shiftet". jeden zweiten shift wird dann eine Funktion getriggert die dann Daten auswirft. Sinnvoll koppeln -> nur eine Liste befüllen und der Rest bekommt automatisch Daten! In dieser Klasse noch eine Funktion um eventuell alle Werte (sortiert nach Rangordnung der Folgelisten(die ja vom gleichen Typ sind) ausgeben zu lassen...
Hallo, Sebastian__ schrieb: > Implementiert wird das ganze in C# mit Net4.0. > Man hat da so nette funktionen in den Listen wie AVG, Min, Max usw. Aber > es sollte halt nicht so sehr zu lasten der Performance gehen. Dehalb > will ich die Datenmenge auf das nötigste reduzieren. > > MfG > Sebastian Lohnt sich der Aufwand? Wenn Du ohnehin genug Speicherplatz hast, waere ein ausmessen der tatsaechlich gebrauchten Zeit sicher interessant. http://www.codeproject.com/KB/dotnet/perfcounter.aspx Willst Du denn nur fuer die ersten 10 min AVG/Min/MAX berechnen?
Danke schon mal für die Antworten.
Das mit den 3 Listen hört sich schon mal gut an und sollte von der
Performance gut skalieren.
Das ganze muss dann nach aussen so gekapselt werden das die 3 Listen
ausehen wie eine Liste, aber das sollte nicht so schwer sein.
>Willst Du denn nur fuer die ersten 10 min AVG/Min/MAX berechnen?
Nein, auch über den gesamten Zeitbereich, aber die ersten 10min müssen
die Daten genau sein, dann reicht auch eine ungenauer Wert.
Hallo, dann weiß ich nicht, ob dieses vorgeschlagene Verfahren: >Karl Heinz Buchegger schrieb: > user schrieb: >> mache doch mehere listen, > > Hätt ich jetzt auch gesagt. > Mehrstufig arbeiten > > Liste_1_Sekunde > Liste_2_Sekunden > Liste_4_Sekunden > > Kommt ein Datensatz dazu, dann wird er vorne in die Liste_1_Sekunde > eingereiht. Dafür fällt hinten aus dieser Liste einer raus. VOn diesen > dort herausfallenden Einträgen nimmst du nur jeden 2.ten und stopfst den > in die Liste_2_Sekunden hinein. Auch dort fällt für jeden vorne > reingestopften hinten wieder einer raus. Und auch dort wieder das > gleiche Spiel: du nimmst nur jeden 2.ten und stopfst den wiederrum in > die Liste_4_Sekunde rein. das auch so tut, wie erwartet. Wenn Du AVG,Max,Min der Liste_2_Sekunden berechnest, wäre das nur mit den 2-sekündlichen Daten von Minute 10 bis 30, entsprechend Liste_4_Sekunden nur von Minute 30 bis 60. Ich glaube nicht, dass der Aufwand lohnt mit 3 Ringspeicher lohnt. Wie wäre es mit einer extra Liste/Feld, in der nur der relevante Wert der Logdaten steht. Ständen die Werte speichertechnisch lückenlos hintereinander, könnte Net4 wohl mit SSE-Befehlen arbeiten, falls es der JIT-compiler überhaupt unterstützt.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.