NEWS
[Gelöst] Memory Problem beim ausführen von Javascript Code
-
Hallo Leute,
habe bei mir folgendes Script am laufen:
/* VIS Fotoshow */ var logging = false; var instanz = 'javascript.0.'; var idURL = instanz + 'VIS.URL.Foto'; var foto_url; function findeFoto () { foto_url = "http://192.168.100.165:8082/vis.0/fotos/foto" + Math.floor(Math.random()*(138-1+1)+1) +".jpg"; //Hochkant + Breit for(var i=1;i<=6;i++){ foto_url = "http://192.168.100.165:8082/vis.0/fotos/hoch/Foto" + Math.floor(Math.random()*(442-1+1)+1) +".jpg"; createState('VIS.URL.Foto'+"Hochkant"+i,'', { name: 'Link zur Fotoshow', desc: 'Waehlt zufällig ein Foto', type: 'string' }); setState(idURL+"Hochkant"+i, foto_url); foto_url = "http://192.168.100.165:8082/vis.0/fotos/quer/Foto" + Math.floor(Math.random()*(711-1+1)+1) +".jpg"; createState('VIS.URL.Foto'+"Breit"+i,'', { name: 'Link zur Fotoshow', desc: 'Waehlt zufällig ein Foto', type: 'string' }); setState(idURL+"Breit"+i, foto_url); //log (idURL+"breit"+i); } setState(idURL, foto_url); } // Ende findeFoto schedule("*/10 * * * *", findeFoto); // alle 10 Minuten findeFoto();
Solange ich das Script einfach nur laufen lasse habe ich kein Problem. Nachdem ich allerdings in einer VIS View die wechselnden Bilder in einem Widget anzeigen lasse (Wanddisplay) entsteht folgendes Problem:
Der RAM-Verbruach des Prozess iobroker.js-controller wird alle 10 Minuten nachdem ausführen des Scripts immer etwas größer was nach etwa 4h dazu führt das der iobroker nicht mehr erreichbar ist.
node v4.8.0
js-controller v0.17.2
Über Hinweise bin ich dankbar.
Grüße
afroasiate
-
Als erstes würd eich die "createState" mal alle vorab EINMALIG ausführen. Also aus der Funktion rausnehmen und vorher machen. Dann nur die setStates … vllt reicht das ja schon
-
Afroasiate,
zuerst würde ich die 'createStates' zuerst im script durchführen on aus dem fideFoto() weglassen, dort reicht es mit setState diese neu zu füllen.
In der momentanen Version wird alle 10 Minuten 12 neue States kreiert/ersetzt, das ist nicht notwendig, du brauchst sie ja nur mit den neuen Werten zu beschreiben.
Deine (xxx-1+1) verstehe ich auch nicht könnte durch xxx ersetzt werden, aber das ist nicht problematisch…
/* VIS Fotoshow */ var logging = false; var instanz = 'javascript.0.'; var idURL = instanz + 'VIS.URL.Foto'; var foto_url; for(var i=1;i<=6;i++){ createState('VIS.URL.Foto'+"Hochkant"+i,'', { name: 'Link zur Fotoshow', desc: 'Waehlt zufällig ein Foto', type: 'string' }); createState('VIS.URL.Foto'+"Breit"+i,'', { name: 'Link zur Fotoshow', desc: 'Waehlt zufällig ein Foto', type: 'string' }); } function findeFoto () { foto_url = "http://192.168.100.165:8082/vis.0/fotos/foto" + Math.floor(Math.random()*138+1) +".jpg"; //Hochkant + Breit for(var i=1;i<=6;i++){ foto_url = "http://192.168.100.165:8082/vis.0/fotos/hoch/Foto" + Math.floor(Math.random()*442+1) +".jpg"; setState(idURL+"Hochkant"+i, foto_url); foto_url = "http://192.168.100.165:8082/vis.0/fotos/quer/Foto" + Math.floor(Math.random()*711+1) +".jpg"; setState(idURL+"Breit"+i, foto_url); //log (idURL+"breit"+i); } setState(idURL, foto_url); } // Ende findeFoto schedule("*/10 * * * *", findeFoto); // alle 10 Minuten setTimeout(findeFoto,500);
Ja, das erste findeFoto hab ich auch verspätet da man createState etwas Zeit geben sollte, sind doch createState und setState asynchrone Funktionen!
-
Leider ist das Problem damit nicht gelöst. Der RAM ist heute Nacht wieder vollgelaufen.