Benutzer-Werkzeuge

Webseiten-Werkzeuge


howto:datenmengen

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
Nächste ÜberarbeitungBeide Seiten der Revision
howto:datenmengen [2018/12/04 08:49] wf_bitplan.comhowto:datenmengen [2021/02/21 10:25] – [Daten löschen] sudo nötig jau
Zeile 29: Zeile 29:
 delete FROM `data` where timestamp< (unix_timestamp(current_timestamp)-24*60*60)*1000 ; delete FROM `data` where timestamp< (unix_timestamp(current_timestamp)-24*60*60)*1000 ;
 </code> </code>
-Das Beispiel löscht alle Daten die vor den letzten 24h liegen. Läßt man das Script einmal am Tag laufen so hat man lediglich die Daten der letzten Stunden.+Das Beispiel löscht alle Daten die vor den letzten 24h liegen. Lässt man das Script einmal am Tag laufen so hat man lediglich die Daten der letzten Stunden.
  
 === weich === === weich ===
Zeile 35: Zeile 35:
 Dazu steht das Script [[https://github.com/volkszaehler/volkszaehler.org/blob/master/bin/vzcompress2|vzcompress2]] zur Verfügung. Von Haus aus hat der lokale User vz keine Rechte zum Löschen in der Datenbank, das muss man vorher ändern: Dazu steht das Script [[https://github.com/volkszaehler/volkszaehler.org/blob/master/bin/vzcompress2|vzcompress2]] zur Verfügung. Von Haus aus hat der lokale User vz keine Rechte zum Löschen in der Datenbank, das muss man vorher ändern:
 <code> <code>
-mysql --user=root -praspberry+sudo mysql --user=root -praspberry
 Welcome to the MySQL monitor.  Commands end with ; or \g. Welcome to the MySQL monitor.  Commands end with ; or \g.
 Your MySQL connection id is 37217 [..] Your MySQL connection id is 37217 [..]
Zeile 55: Zeile 55:
  
 ===== Performance der Middleware erhöhen: Datenaggregation / Cache ===== ===== Performance der Middleware erhöhen: Datenaggregation / Cache =====
-Bleiben die Daten in voller Auflösung erhalten, wird mit der Zeit die Middleware immer langsamer, da es aus den Daten die zur Anzeige benötigten suchen muss. Gerade bei grossen Zoomstufen (z.B. auf ein Jahr) kann es dann notwendig werden, dass die gesamte Datenbank eingelesen werden muss.+Bleiben die Daten in voller Auflösung erhalten, wird mit der Zeit die Middleware immer langsamer, da es aus den Daten die zur Anzeige benötigten suchen muss. Gerade bei großen Zoomstufen (z.B. auf ein Jahr) kann es dann notwendig werden, dass die gesamte Datenbank eingelesen werden muss.
 Abhilfe schafft hier die Daten ganzer Zeiträume, wie z.B. eines Tages, in einzelnen Datenpunkten zusammenzufassen (etwa Durchschnittstemperatur an diesem Tag). Dies erzeugt zwar mehr Daten in der Datenbank und benötigt somit mehr Platz auf der Festplatte. Allerdings kann auf die Daten effizienter zugegriffen werden, so dass sich unter dem Strich die Geschwindigkeit erhöht. Abhilfe schafft hier die Daten ganzer Zeiträume, wie z.B. eines Tages, in einzelnen Datenpunkten zusammenzufassen (etwa Durchschnittstemperatur an diesem Tag). Dies erzeugt zwar mehr Daten in der Datenbank und benötigt somit mehr Platz auf der Festplatte. Allerdings kann auf die Daten effizienter zugegriffen werden, so dass sich unter dem Strich die Geschwindigkeit erhöht.
  
 Die Lösung besteht aus zwei Komponenten. Die eine ist bereits im Frontend eingebaut und aktiviert sich automatisch, sobald sie passende Daten findet. Die andere besteht aus einer weiteren Tabelle mit Scripten die diese füllen. Die Lösung besteht aus zwei Komponenten. Die eine ist bereits im Frontend eingebaut und aktiviert sich automatisch, sobald sie passende Daten findet. Die andere besteht aus einer weiteren Tabelle mit Scripten die diese füllen.
  
-Zunächst muss die Option in der volkszaehler.conf.php aktiviert werden: (die findet ihr unter: /var/www/volkszaehler.org/etc ) +
-<code>$config['aggregation'] = true;</code>+
  
 Die folgende Zeile aggregiert alle bestehenden Daten. Der Vorgang kann daher einige Stunden benötigen: Die folgende Zeile aggregiert alle bestehenden Daten. Der Vorgang kann daher einige Stunden benötigen:
Zeile 73: Zeile 72:
 </code> </code>
  
-Mit den folgenden Einträgen in einer crontab hält man den Cache aktuell. Erstellt wird die crontab mit: 'crontab -e'.\\+Mit den folgenden Einträgen in einer crontab hält man den Cache aktuell. Erstellt wird die crontab mit: ''crontab -e''.\\
 Das Script legt nur an, was noch nicht angelegt wurde und läuft daher nur kurz: Das Script legt nur an, was noch nicht angelegt wurde und läuft daher nur kurz:
 <code> <code>
Zeile 112: Zeile 111:
  
 === duplicates === === duplicates ===
-Es kann vorkommen das sich ein Zählerstand oder Momentanwert über längere Zeit nicht verändert. Dennoch geht vzlogger davon aus das jeder gleich wichtig ist und schickt ihn an die Middleware weiter was zu aufeinander folgenden Datensätzen mit identischem Wert führt. //duplicates// ist ein Parameter in der Kategorie //channels// der vzlogger.conf der diese Folgedaten reduziert.+Es kann vorkommen, dass sich ein Zählerstand oder Momentanwert über längere Zeit nicht verändert. Dennoch geht vzlogger davon aus, dass jeder gleich wichtig ist und schickt ihn an die Middleware weiter was zu aufeinander folgenden Datensätzen mit identischem Wert führt. //duplicates// ist ein Parameter in der Kategorie //channels// der vzlogger.conf der diese Folgedaten reduziert.
 <code | vzlogger.conf> <code | vzlogger.conf>
       "duplicates": 3600,</code>       "duplicates": 3600,</code>
Zeile 134: Zeile 133:
 ^ "sum" | Summe | zu verwenden bei Impulsen (S0) | ^ "sum" | Summe | zu verwenden bei Impulsen (S0) |
 ^ "none"| | keine Aggreagtion vornehmen, alle Daten des //channel// gehen an die Middleware | ^ "none"| | keine Aggreagtion vornehmen, alle Daten des //channel// gehen an die Middleware |
- 
-===== Aggregieren mit mySQL ===== 
-**Function channelSum** 
-Die folgende mySQL Hilfsfunktion berechnet die "Summe" von Werten für ein electric Meter über einen gegebenen Zeitraum.Dazu wird 
-der höchste und der niedrigste Wert gesucht. Es gilt sum=max - min für solche Zähler. 
- 
-Der Aggregationseffekt von channelSum hängt von der Frequenz der Datenerhebung und der Länge des Intervals ab. Bei der Erhebung eines Wertes alle 15 Minuten und einer Zeitraumbreite von einem Tag werden 15x24 = 320 x weniger Daten geliefert. 
-<code> 
--- 
--- Volkszähler mySQL function to sum up channel data for a given time period 
--- 
--- params 
---    channel_id  int   - the id of the channel 
---    from_time   date  - the time from which to sum up 
---    to_time     date  - the time to which to sum up 
--- 
-CREATE FUNCTION channelSum(channel_id INT, from_time DATE, to_time DATE)  
-  RETURNS DOUBLE 
-  DETERMINISTIC 
-BEGIN 
- DECLARE d_min double; 
- DECLARE d_max double; 
- SELECT min(d.value), max(d.value) INTO d_min,d_max 
- FROM data d  
- WHERE d.timestamp between unix_timestamp(from_time)*1000 and unix_timestamp(to_time)*1000 and d.channel_id=channel_id; 
- RETURN d_max-d_min; 
-END 
-</code> 
- 
-**Daily Tabelle** 
-Das folgende mySQL Script erzeugt mit Hilfe der obigen "channelSum" Funktion eine "daily" Tabelle mit Tagessummen für Messwerte vom Typ "electric meter". Im Beispiel werden die Werte für den Zeitraum 2014-01-01 bis 2018-11-30 aufsummiert. Für die Erzeugung von 7450 Einträgen hat diese Abfrage ca. 2700 Sekunden Zeit gebraucht und dazu mehrere Millionen Einträge betrachtet. Beim zweiten Aufruf kann man statt des "CREATE Table" einen "INSERT " benutzen, sonst ist zuvor ein "DROP Table" erforderlich.  
- 
-Als Basis diente eine SQL-Abfrage zur Erzeugung einer Liste von Tagen siehe: https://stackoverflow.com/a/53541150/1497139 
- 
-<code> 
-create table daily as 
-select  
-  dates.from_date,e.id,format(channelSum(e.id,dates.from_date,dates.to_date),0) as diff,e.type, p.value 
-from ( 
-select  
-  date_add('2014-01-01',interval row day)   as from_date,  
-  date_add('2014-01-01',interval row+1 day) as to_date    
-from ( 
-    SELECT @row := @row + 1 as row FROM  
-    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t, 
-    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t2,  
-    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t3,  
-    (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t4,  
-    (SELECT @row:=-1) r 
-) sequence 
-where date_add('2014-01-01',interval row+1 day) <= '2018-01-30') dates 
-join entities    
-join properties p on e.id=p.entity_id 
-join properties r on e.id=r.entity_id 
-where p.pkey='title' and r.pkey='resolution' 
-and e.type='electric meter'; 
-</code> 
  
 ===== Aufrüstung: Hardware ===== ===== Aufrüstung: Hardware =====
howto/datenmengen.txt · Zuletzt geändert: 2021/08/11 13:31 von mr.gosh