[57_Calendar.pm] Speicherverbrauch

Begonnen von michael.winkler, 21 Juli 2017, 10:27:22

Vorheriges Thema - Nächstes Thema

michael.winkler

Hallo ,

ich habe meine iCloud Kalender über das Modul angebunden. Da ich vor kurzem Probleme beim Speicherverbrauch hatte, hatte mir Rudolf geholfen diesen zu analysieren. Das letzte Modul welches jetzt noch extrem(im vergleich zu anderen) viel Speicher verbraucht ist das Kalender Modul

Hier mal ein Auszug vom aktuellen Sepicherverbraucht


fhem> fhemdebug memusage
   1. intAt                           8888066
   2. icloud.kalender                 6644916
   3. selectlist                      1132615
   4. CUL_HM                           721385
   5. HMConfig::culHmRegDefine         647302
   6. Abfall                           608981
   7. teleBot                          587734


Unter den Top 7 sind meine beiden Kalender "Abfall" und "icloud.kalender" zu finden.

Bei meiner Analyse habe ich festgestellt dass das Modul alle Ereignisse vom icloud Kalender abruft. Bei mir geht er bis ins Jahr 2015 zurück. Hierbei spielt es auch keine Rolle ob die beiden Attribute "hideLaterThan" und oder "hideOlderThan" gesetzt wurde. Die Anzahl der records processed ist immer gleich groß.

Gibt es eventuell eine andere Möglichkeit nur die Termine in den Speicher zu laden welche sich noch zwischen dem Zeitraum "hideLaterThan" und "hideOlderThan" befinden?

Verbose=5 Log

2017.07.21 10:16:09 4: Calendar icloud.kalender: Wakeup
2017.07.21 10:16:09 4: Calendar icloud.kalender: Updating...
2017.07.21 10:16:10 4: Calendar icloud.kalender: Getting data from URL <hidden>
2017.07.21 10:16:12 4: Calendar icloud.kalender: parsing data asynchronously (PID= 8271)
2017.07.21 10:16:12 5: Calendar icloud.kalender: control passed back to main loop.
2017.07.21 10:16:13 4: Calendar icloud.kalender: got result from asynchronous parsing.
2017.07.21 10:16:13 4: Calendar icloud.kalender: asynchronous parsing finished.
2017.07.21 10:16:13 4: Calendar icloud.kalender: merging data
2017.07.21 10:16:13 4: Calendar icloud.kalender: 1227 records processed, 0 new, 1227 known, 0 modified, 0 changed.
2017.07.21 10:16:13 4: Calendar icloud.kalender: creating calendar events
2017.07.21 10:16:14 4: Calendar icloud.kalender: Checking times...
2017.07.21 10:16:14 3: CALVIEW icloud.kalender.view - CALENDAR:icloud.kalender triggered, updating CALVIEW icloud.kalender.view ...
2017.07.21 10:16:15 4: Calendar icloud.kalender: process ended.


Anbei noch ein list icloud.kalender

Internals:
   DEF        ical url http://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 600
   NAME       icloud.kalender
   NOTIFYDEV  global
   NR         562
   NTFY_ORDER 50-icloud.kalender
   STATE      triggered
   TYPE       Calendar
   READINGS:
     2017-07-21 10:22:30   calname         Privat
     2017-07-21 10:22:30   lastUpdate      2017-07-21 10:22:26
     2017-03-14 08:37:49   modeAlarm
     2017-07-21 10:00:00   modeAlarmOrStart XXXXX
     2017-03-14 08:37:49   modeAlarmed
     2017-07-21 10:06:14   modeChanged
     2017-07-20 17:16:14   modeEnd         XXXXX
     2017-07-20 09:08:46   modeEnded
     2017-07-21 10:00:00   modeStart       XXXXX
     2017-07-21 10:06:14   modeStarted
     2017-07-21 10:00:00   modeUpcoming    XXXXX
     2017-07-21 10:22:30   nextUpdate      2017-07-21 10:32:26
     2017-07-21 10:22:31   nextWakeup      2017-07-21 10:32:26
     2017-07-21 10:22:30   state           triggered
Attributes:
   hideLaterThan 20d
   hideOlderThan 10
   update     async
   verbose    5

michael.winkler

So ich war mal so frei und habe versucht den Speicherbedarf zu reduzieren. Bitte nicht böse sein, soll nur mal als Diskussionsgrundlage dienen.

Wenn ich den Zusatzbefehl zwischen die Zeilen(2438) hier eintrage.


  foreach my $v (grep { $_->{type} eq "VEVENT" } @{$root->{entries}}) {
        #main::Debug "Merging " . $v->asString();
        my $found= 0;
        my $added= 0; # flag to prevent multiple additions


Zusatzbefehl

if ($v->tm($v->value("DTEND")) < time() && $v->valueOrDefault("RRULE", "") eq "") {next;}


Dann sieht mein Speicherverbrauche wie folgt aus


   1. intAt                           2616700
   2. icloud.kalender                 1113998
  12. Abfall                           306397


Im Vergleich zu vorher richtig klein. Interessant ist auch das der Bereich "intAt" auch geschrumpft ist.

Anbei noch der komplette Code in diesem Bereich


  foreach my $v (grep { $_->{type} eq "VEVENT" } @{$root->{entries}}) {
 
if ($v->tm($v->value("DTEND")) < time() && $v->valueOrDefault("RRULE", "") eq "") {next;}
 
        #main::Debug "Merging " . $v->asString();
        my $found= 0;
        my $added= 0; # flag to prevent multiple additions


Dr. Boris Neubert

Hallo Michael,

vielen Dank, dass Du Dir diese Gedanken gemacht hast und auch eine Änderung vorschlägst. Auf den ersten Blick sieht sie plausibel aus. Mir gefällt, dass Dir aufgefallen ist, dass nicht alle Einträge mit DTEND in der Vergangenheit ignoriert werden müssen, sondern nur solche, die sich nicht mit einer Regel potentiell in die Zukunft fortpflanzen.

Kannst Du mit svn diff einen Patch erstellen und hier anfügen?

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

michael.winkler

Zitat von: Dr. Boris Neubert am 24 Juli 2017, 19:21:44
Kannst Du mit svn diff einen Patch erstellen und hier anfügen?
Ich hoffe dass ich das jetzt richtig gemacht habe. Muss mich da noch etwas durch die SVN Geschichten durchkämpfen.

Um weiteren Speicher zu sparen habe ich noch ein Attribut "removevcalender" mit den Werten "0|1" erzeugt. Zusätzlich habe ich die Commandref in DE&EN erweitert und das Attribut gleich beschrieben. Dabei ist mir noch ein Fehler bei der deutschen Beschreibung aufgefallen.

Wenn Du die Änderung bezüglich dem Attribut nicht möchtest kann ich es wieder rausnehmen. Dann würde ich dir einen aktualisierten Patch bereitstellen.

Gruß
Michael

Dr. Boris Neubert

Vielen Dank, Michael.

Ich habe den Patch eingespielt, stilistisch überarbeitet und eingecheckt. Steht somit ab morgen zum Update bereit.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

mahowi

#5
Seit dem heutigen Update bleibt mein Kalender leer.

2017.07.31 08:31:12.516 4 : Calendar Cal_WAB: Updating...
2017.07.31 08:31:12.517 5 : SSL verify mode set to 1
2017.07.31 08:31:12.519 4 : Calendar Cal_WAB: Getting data from URL <hidden>
2017.07.31 08:31:12.961 4 : Calendar Cal_WAB: parsing data asynchronously (PID= 9494)
2017.07.31 08:31:12.963 5 : Calendar Cal_WAB: control passed back to main loop.
2017.07.31 08:31:13.965 4 : Calendar Cal_WAB: got result from asynchronous parsing.
2017.07.31 08:31:13.966 4 : Calendar Cal_WAB: asynchronous parsing finished.
2017.07.31 08:31:13.982 4 : Calendar Cal_WAB: merging data
2017.07.31 08:31:13.982 1 : PERL WARNING: Use of uninitialized value in numeric lt (<) at ./FHEM/57_Calendar.pm line 2442.
2017.07.31 08:31:13.983 1 : stacktrace:
2017.07.31 08:31:13.983 1 : main::__ANON__ called by ./FHEM/57_Calendar.pm (2442)
2017.07.31 08:31:13.983 1 : main::Calendar_UpdateCalendar called by ./FHEM/57_Calendar.pm (2309)
2017.07.31 08:31:13.983 1 : main::Calendar_PollChild called by fhem.pl (3004)
2017.07.31 08:31:13.984 1 : main::HandleTimeout called by fhem.pl (618)
[...]
2017.07.31 08:31:14.055 4 : Calendar Cal_WAB: 0 records processed, 0 new, 0 known, 0 modified, 0 changed.
2017.07.31 08:31:14.056 4 : Calendar Cal_WAB: creating calendar events
2017-07-31 08:31:14.063 Calendar Cal_WAB calname: Mülltermine Sägewerk Gerhard\, Rennerod
2017-07-31 08:31:14.063 Calendar Cal_WAB lastUpdate: 2017-07-31 08:31:12
2017-07-31 08:31:14.063 Calendar Cal_WAB nextUpdate: 2017-08-01 08:31:12
2017.07.31 08:31:14.064 4 : Calendar Cal_WAB: Checking times...
2017-07-31 08:31:14.096 Calendar Cal_WAB triggered
2017-07-31 08:31:14.103 Calendar Cal_WAB nextWakeup: 2017-08-01 08:31:12
2017.07.31 08:31:14.103 4 : Calendar Cal_WAB: process ended.


Der Kalender enthält definitiv Termine und ist nicht leer.


Edit: Scheinbar hat Google heute Probleme. Beim Abrufen der ical-URL im Browser sagt Google Fehler beim Verarbeiten eines Feeds
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

michael.winkler

Zitat von: mahowi am 31 Juli 2017, 08:39:11
Seit dem heutigen Update bleibt mein Kalender leer.

Der Kalender enthält definitiv Termine und ist nicht leer.


Edit: Scheinbar hat Google heute Probleme. Beim Abrufen der ical-URL im Browser sagt Google Fehler beim Verarbeiten eines Feeds
Hi,

um auszuschließen ob es an der Zeile 2442 liegt kannst du diese ja mal mit einem "#" auskommentieren. Dann arbeitet das Modul wieder wie früher. Wenn es danach immer noch nicht geht liegt es sicherlich an deinem Googlekalender.

Nach dem auskommentieren ein "shutdown restart" nicht vergessen

Gruß
Michael

mahowi

Hallo Michael,

nach Auskommentieren der Zeile 2442 wird der Kalender wieder befüllt. Scheinbar liegt es also doch daran.
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

Dr. Boris Neubert

Hallo,

ich werde heute abend wieder eine Version ohne diese Zeile einchecken.

Die Zeile enthält eine Heuristik, um Termine zu identifizieren, die nicht mehr relevant sind. Es wäre interessant zu sehen, warum diese bei dem Müllkalender nicht greift.

@Mahowi: kannst Du bitte Deine ical-Datei anhängen?

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

mahowi

Kein Problem, ich habe die Datei angehängt.
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

michael.winkler

Zitat von: mahowi am 31 Juli 2017, 10:43:41
Kein Problem, ich habe die Datei angehängt.
Die Termine haben kein Enddatum, wie trägst du diese ein?

Kannst du mal die Zeile 2442 durch folgende ersetzen?


next if ($v->tm($v->valueOrDefault("DTEND"),time()) < time() && $v->valueOrDefault("RRULE", "") eq "");

mahowi

Die Termine werden automatisch von unserem Abfallunternehmen übernommen. Es gibt eine App (WAB-App), über die ich die Abfalltermine mit dem Google-Kalender synchronisieren kann.

Das Abändern der Zeile hilft leider nicht, es kommen dieselben Fehlermeldungen wie vorher und es werden keine Termine abgeholt.
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

michael.winkler

Zitat von: mahowi am 31 Juli 2017, 11:02:52
Die Termine werden automatisch von unserem Abfallunternehmen übernommen. Es gibt eine App (WAB-App), über die ich die Abfalltermine mit dem Google-Kalender synchronisieren kann.

Das Abändern der Zeile hilft leider nicht, es kommen dieselben Fehlermeldungen wie vorher und es werden keine Termine abgeholt.

Habe jetzt deine .ics Datei mal eingebunden Kannst du mal die Zeile 2442 durch folgendes ersetzen?

if ($v->valueOrDefault("DTEND", "") eq "") {
next if ($v->tm($v->value("DTSTART")+1) < time() && $v->valueOrDefault("RRULE", "") eq "");
}else {
next if ($v->tm($v->value("DTEND")) < time() && $v->valueOrDefault("RRULE", "") eq "");
}

mahowi

Danke, damit funktioniert es jetzt.  :)
CUBe (MAX): HT, FK | CUBe (SlowRF): ESA2000WZ
JeeLink: LaCrosse | nanoCUL433: Smartwares SHS-51001-EU, EM1000GZ
ZME_UZB1: GreenWave PowerNode, Popp Thermostat | SIGNALDuino: HE877, X10 MS14A, Revolt NC-5462,  IT Steckdosen + PIR
tado° | Milight | HUE, Lightify | SmarterCoffee

michael.winkler

Zitat von: Dr. Boris Neubert am 31 Juli 2017, 10:04:20
Hallo,

ich werde heute abend wieder eine Version ohne diese Zeile einchecken.

Die Zeile enthält eine Heuristik, um Termine zu identifizieren, die nicht mehr relevant sind. Es wäre interessant zu sehen, warum diese bei dem Müllkalender nicht greift.

@Mahowi: kannst Du bitte Deine ical-Datei anhängen?

Viele Grüße
Boris

Hi Boris,

mit folgendem Code funktioniert es auch bei dem Benutzer "Mahowi"


if ($v->valueOrDefault("DTEND", "") eq "") {
next if ($v->tm($v->value("DTSTART")+1) < time() && $v->valueOrDefault("RRULE", "") eq "");
}else {
next if ($v->tm($v->value("DTEND")) < time() && $v->valueOrDefault("RRULE", "") eq "");
}


Gruß
Michael

Dr. Boris Neubert

Hallo,

ich habe nun eine überarbeitete Version eingecheckt. Termine werden nur weggeschnitten, wenn das Attribut cutoffOlderThan gesetzt ist. Serientermine und Termine ohne Endedatum werden nicht weggeschnitten. cutoffOlderThan unterscheidet sich von hideOlderThan dadurch, dass die weggeschnittenen Termine gar nicht erst in den Kalender geladen werden, während die mit hideOlderThan versteckten Termine nur nicht angezeigt werden.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

michael.winkler

Zitat von: Dr. Boris Neubert am 01 August 2017, 20:40:06
Hallo,

ich habe nun eine überarbeitete Version eingecheckt. Termine werden nur weggeschnitten, wenn das Attribut cutoffOlderThan gesetzt ist. Serientermine und Termine ohne Endedatum werden nicht weggeschnitten. cutoffOlderThan unterscheidet sich von hideOlderThan dadurch, dass die weggeschnittenen Termine gar nicht erst in den Kalender geladen werden, während die mit hideOlderThan versteckten Termine nur nicht angezeigt werden.

Viele Grüße
Boris
Funktioniert, danke!