Aller au contenu

Taille maximale d'une chaînes dans une variable globale...


Messages recommandés

Posté(e)

Suite à  un besoin particulier je voulais m'assurer de la taille maximale d'une variable globale afin de persister des informations de type chaînes de caractères

 

si vous souhaitez faire l’expérience vous même, il faut créer une variable globale, ici: varMaxLength, puis dans un périphérique virtuel ajouter le code suivant dans un bouton

for i=1, 250 do
  fibaro:setGlobal("varMaxLength", 
    fibaro:getGlobalValue("varMaxLength").."0");
  fibaro:debug("global variable length is now "..string.len(fibaro:getGlobalValue("varMaxLength")));
end 

pour remettre la variable à  zero, dans un autre bouton le code suivante:

fibaro:setGlobal("varMaxLength", "");

228 est donc la taille maximale d'une chaîne dans une variable globale

 

:)

  • 6 mois après...
Posté(e)

Oui c'est pas énorme :( c'est pour cela qu'il me semblait important d'en parler ;) car c'est l'unique moyen ànotre disposition pour persister des infos et les partager entre divers codes...

  • Upvote 1
  • 1 an après...
Posté(e)

Déterrage de sujet....

 

J'essaie de déterminer le nombre max de caractères dans une Variable Globale en v4.061 beta

fibaro:setGlobal("varMaxLength", "")
for i=1, 1000 do
	local texte = string.rep('0', i*10)
	fibaro:debug(i.." - global variable length is now "..string.len(texte))
	fibaro:setGlobal("varMaxLength", texte)
end

Lorsque i=817, donc la variable fait 8170 caractères de long, l'affichage s'arrête brusquement.

En mettant des traces partout, c'est l'instruction setGlobal() qui crashe.

Sous Linux, un core dump apparait.

 

Ce qui m'étonne, c'est que @tcheri affirme dans ce topic que Steven a pu monter à  40'000 caractères.

 

Vous pouvez tester et me dire ce que vous en pensez ?

Steven, tu as une autre méthode pour tester la longueur d'une VG ?

 

Ou alors c'est une régression dans les v4 récentes.... ce ne serait pas la première fois !

Posté(e)

De mémoire je n'avais pas insérer de String mais du JSON vide.

 

Je prenais un json vide que j'ajoutais à  un autre json puis sauver dans une VG et ainsi de suite jusqu'à  la rupture. Le json étant composé de caractères {[]}, j'arrivais à  plus de 40'000 caractères avant que le système soit trop lent et que j'arrète le tout.

 

Par contre sur les dernières version, il y a un controle de "Out of memory" qui risque d'exploser les tests.

Posté(e)

Perso leur contrôle est vraiment merdique car j'ai quelques scènes qui fonctionne très bien mais consomme un peu de mémoire toutes les 5 mn qui sont complètement bloquée par leur contrôle de m....

 

En bref, on paie cher, très CHER pour du LUA mais on nous bride complètement.

 

6413101412.png

  • Upvote 2
Posté(e)

La bonne pratique pour persister des infos dans une VG  est de créer une table puis d' enregistrer le résultat d'un json.encode sur cette table. C'est ce que j'utilise depuis 2 ans et ça marche très bien ;) J'espère juste que Fibaro ne décide pas de limiter ça aussi, ils ont bien limité la taille des mainloops dans les VD :(

 

@Steven, Out of memory punaise je ne l'avais pas encore vu celui-la, tu es trop fort :P

Posté(e)

Après analyse, c'est pas mon script .. c'est la box qui est d'elle même à  99% et dès que mon script s'execute, elle me fait un Out of memory sur mes scripts ... en redémarrant la box, tout redevient à  la normal ... Pffftttt ... elle m'a fait peur.

 

Elle a du atteindre les 99% lors que j'ai balancé un test (pourri)   :D

  • Upvote 1
Posté(e)

Moi le out of memory me fais penser àmon vieux commodore 64 et ces 64ko. C'était une erreur classique sur ce type d'ordinateur.

@steven il va falloir ajouter 2go de ram

Enfin moi je suis pas pour car pour moi 1go devrait suffire largement. Et je ne comprend pas pourquoi la box plante des qu elle utilise le swap

Envoyé de mon SM-G900F en utilisant Tapatalk

Posté(e)

Merci Steven et JC :)

 

Bon justement ça tombe bien, car c'est du JSON que je veux mettre dans la variable globale.

J'ai donc une table, et j'utilise json.encore pour écrire dans la VG.

Mais j'ai toujours le plantage dès que je dépasse 8000 et quelques caractères :

fibaro:setGlobal("varMaxLength", "")
local data = {id=0, timestamp="NULL", type="temperature", value=10}
fibaro:debug("data length = "..string.len(json.encode(data)))
local datas = {}

for i=1, 1000 do
	datas[i] = data
	local payload = json.encode(datas)
	fibaro:debug(i.." - global variable length is now "..string.len(payload))
	fibaro:setGlobal("varMaxLength", payload)
end

Ce qui donne le debug :

[DEBUG] 21:39:33: data length = 59
[DEBUG] 21:39:33: 1 - global variable length is now 61
[DEBUG] 21:39:33: 2 - global variable length is now 121
[DEBUG] 21:39:33: 3 - global variable length is now 181
[DEBUG] 21:39:33: 4 - global variable length is now 241
[DEBUG] 21:39:33: 5 - global variable length is now 301
...
[DEBUG] 21:39:33: 136 - global variable length is now 8161
[DEBUG] 21:39:33: 137 - global variable length is now 8221

et pouf, plus rien :(

 

En même temps c'est logique, dès lors qu'on fait un json.encode, la table devient une simple chaine de caractères.

 

Ou alors j'ai pas compris la technique à  employer ?

J'ai bien essayer d'envoyer le json directement dans la fonction setGlobal(), mais bien sur il ne veut pas, il me dit qu'il veut un string et pas une table.

 

PS : tout ça dans un bouton de VD (et non pas une scène)

  • 3 ans après...
Posté(e)

Maxi déterrage de topic

 

Je viens de refaire tourner le petit script donné dans mon post juste au-dessus (il y a 3 ans et demi donc...) dans un bouton de VD.

Je suis en V4.540

 

Et le script est allé au bout des 1000 itérations ! Cela a pris 3 minutes et 39 secondes (quand même !) et ma variable globale a donc dépassé 60 ko

[DEBUG] 17:12:31: 1000 - global variable length is now 60001

 

C'est donc très intéressant, Fibaro a donc repoussé cette limite... (ça devait faire partie des "other minor bugfixes" :2:)

Je ne sais pas à combien elle se situe maintenant, il faudrait faire des tests complémentaires, mais on peut maintenant stocker un nombre plus conséquent de données dans une VG en vue d'un traitement ultérieur.

 

Bon après faut relativiser, 60 ko..... on va peut être pouvoir atteindre les 640 Ko du DOS des années 80 :D

 

  • Like 2
×
×
  • Créer...