Hi XXL Ray
ich dachte eher an so etwas: ist noch 'billiger',
aber wie gesagt die Ansätze sind ähnlich und ungefähr so muss man es machen um
nicht in RAM Probleme zu kommen.
void addMeasureSecond (float value)
{
static float minuteSum = 0;
static int minuteCnt = 0;
static float minuteAvg = 0;
// den sekündlichen Messwert auf's Dateisystem wegschreiben
logMeasureSecond(value) ;
// minütlichen Messwert berechnen
minuteSum = minuteSum + value;
minuteCnt = minuteCnt + 1;
if (minuteCnt == 60)
{
// wenn 60 sekündliche messwerte erfasst wurden, den gemittelten Minutenmesswert wegschreiben und zurücksetzten
minuteAvg = minuteSum/minuteCnt;
logMeasureMinute(minuteAvg) ;
minuteSum = 0;
minuteCnt = 0;
// stündlichen Messwert berechnen (kann und darf auf den minütlichen mittelwerten aufsetzten)
...
}
}
Bei diesem Ansatz gibt es keine Listen von Messwerten, minimale RAM Nutzung.
Für jeden Typ Mittelwert wird nur ein Datensatz im RAM gehalten.
cnt: Gesamtzahl
sum: Summe aller Messwerte
sum2: Quadratsumme aller Messwerte (für varianz ...)
Verteilung: array z.B. 31 Werte: 0m/s .. 30m/s
...
Sobald wie ein Mittelwertstyp vollständig ermittelt wurde (seine counts sind voll),
wird dieser in das Log geschrieben und der eine Datensatz vollständig zurückgesetzt.
Im Detail ist dass alles aber nicht soo einfach:
a) Wie initialisiert man die Mittelwerte? z.B. den Stunden Mittelwert, wenn man mitten in einer Stunde anfängt zu loggen?
Vermutlich muss man, was man hat, dann erst mal von Disk laden.
Wie geht man mit Lücken um? Ist es zulässig und sinnvoll zu interpolieren?
b) Gleiches gilt natürlich auch für andere Mittelungen
c) Es sollte beim Mitteln immer auch eine Häufigkeitsverteilung mit aufgenommen werden
...
Float Operationen sind auch für den PI 'teuer', weil der keine FPU hat.
Das kann man versuchen mit int64 Operationen für die Summen versuchen zu vermeiden ...
Gruß Frank
ich dachte eher an so etwas: ist noch 'billiger',
aber wie gesagt die Ansätze sind ähnlich und ungefähr so muss man es machen um
nicht in RAM Probleme zu kommen.
Code
void addMeasureSecond (float value)
{
static float minuteSum = 0;
static int minuteCnt = 0;
static float minuteAvg = 0;
// den sekündlichen Messwert auf's Dateisystem wegschreiben
logMeasureSecond(value) ;
// minütlichen Messwert berechnen
minuteSum = minuteSum + value;
minuteCnt = minuteCnt + 1;
if (minuteCnt == 60)
{
// wenn 60 sekündliche messwerte erfasst wurden, den gemittelten Minutenmesswert wegschreiben und zurücksetzten
minuteAvg = minuteSum/minuteCnt;
logMeasureMinute(minuteAvg) ;
minuteSum = 0;
minuteCnt = 0;
// stündlichen Messwert berechnen (kann und darf auf den minütlichen mittelwerten aufsetzten)
...
}
}
Bei diesem Ansatz gibt es keine Listen von Messwerten, minimale RAM Nutzung.
Für jeden Typ Mittelwert wird nur ein Datensatz im RAM gehalten.
cnt: Gesamtzahl
sum: Summe aller Messwerte
sum2: Quadratsumme aller Messwerte (für varianz ...)
Verteilung: array z.B. 31 Werte: 0m/s .. 30m/s
...
Sobald wie ein Mittelwertstyp vollständig ermittelt wurde (seine counts sind voll),
wird dieser in das Log geschrieben und der eine Datensatz vollständig zurückgesetzt.
Im Detail ist dass alles aber nicht soo einfach:
a) Wie initialisiert man die Mittelwerte? z.B. den Stunden Mittelwert, wenn man mitten in einer Stunde anfängt zu loggen?
Vermutlich muss man, was man hat, dann erst mal von Disk laden.
Wie geht man mit Lücken um? Ist es zulässig und sinnvoll zu interpolieren?
b) Gleiches gilt natürlich auch für andere Mittelungen
c) Es sollte beim Mitteln immer auch eine Häufigkeitsverteilung mit aufgenommen werden
...
Float Operationen sind auch für den PI 'teuer', weil der keine FPU hat.
Das kann man versuchen mit int64 Operationen für die Summen versuchen zu vermeiden ...
Gruß Frank