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
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.