Forum: PC-Programmierung Logdatenreduktion


von Sebastian__ (Gast)


Lesenswert?

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

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Run Length, Huffman Code/Baum, Zip/LZW, ...

Kommt drauf an, wie viel du buffern kannst.

von Sebastian__ (Gast)


Lesenswert?

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.

von user (Gast)


Lesenswert?

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

von Random .. (thorstendb) Benutzerseite


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Stiftli (Gast)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

Extern gibts das fix und fertig: http://oss.oetiker.ch/rrdtool.

von Horst H. (horha)


Lesenswert?

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?

von Sebastian__ (Gast)


Lesenswert?

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.

von Horst H. (horha)


Lesenswert?

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
Noch kein Account? Hier anmelden.