Espace de stockage scilab

Fermé
pitchu - 16 avril 2008 à 15:13
cs_mouezapeter Messages postés 2 Date d'inscription mardi 7 novembre 2000 Statut Membre Dernière intervention 25 mars 2015 - 25 mars 2015 à 17:37
Bonjour,

Je dois faire un programme en scilab et j'ai un petit soucis au niveau de la visualisation des images car il semblerait que je n'ai pas assez d'espace libre. La compilation me donne :

!--error 17
stack size exceeded! (Use stacksize function to increase it)
Memory used for variables : 3115408
Intermediate memory needed: 3508238
Total memory available : 5000001
at line 29 of function asciimat called by :
line 83 of function char called by :
line 26 of function imshow called by :
image=imshow(donnees)
line 51 of exec file called by :
exec('F:\NAOMI\prog\FHMW.sce');disp('exec done');


J'ai donc essayé en rajoutant en début de programme:
n=10^8; ou n = double(1024)*double(1024);
gstacksize(n);

Pour un n > ou < à la valeur que j'ai imposé, le programme n'est pas du tout content!! J'ai donc pris 10^8 comme compromis. J'ai également essayé avec l'instruction stacksize(n) mais pour un même n donné, il semble qu'il est ai moins d'espace sur la pile et le programme beug bien plus tôt :-s.

Par contre j'ai l'impression que le message d'erreur est indépendant de la taille de la pile car j'alloue un espace de n et le message d'erreur n'indique une taille de mémoire différente de n :
Total memory available : 5000001.

En essayant avec une image beaucoup plus petite ça marche donc le problème vient bien de la mémoire et non pas du programme...
Et je comprends de moins en moins quand je regarde l'espace qu'il me reste car :

-->[free, total]=getmemory()
total =
515516.
free =
115580.

J'aimerais savoir si quelqu'un peut m'aider car je n'avance plus du tout ....
Je vous remercie!!!

Pitchu
A voir également:

2 réponses

normalement il y a un changement de version majeur (d'une version n.x vers n+1.0 ) tous les 18 mois et au moins un changement mineur (n.x à n.x+1) tous les 9 mois. La sortie de la version 5.0 est assez proche car ça fait plusieurs mois que des versions alpha sont en tests :


http://www.scilab.org/download/index_download.php?page=5.0-alpha-3



Philippe.
1
cs_mouezapeter Messages postés 2 Date d'inscription mardi 7 novembre 2000 Statut Membre Dernière intervention 25 mars 2015
Modifié par cs_mouezapeter le 25/03/2015 à 17:39
Problème toujours présent!
Seulement, voilà, des fois on n'a pas le choix de la taille de l'image et la réduire en petits morceaux peut être fastidieux à la main. Donc tu peux utiliser libpng libjpeg en C++ qui te donnent accès aux valeurs de l'image pour la découper ou autre (éventuellement refusionner des sparsed matrix).
C'est quand même dommage : Scilab est fait pour l'ingénierie, donc censé traiter de grosses données, très bonnes fonctions, mais à chaque fois ça pêche à cause de la mémoire, alors que ces fichiers sont très bien traités par Audacity par exemple, ou Kdenlive, Gimp...en version précompilée en tous cas. Peut-être existe-t-il une option de compilation pour y remédier à partir des sources?
0
Bonjour pitchu,


La mémoire de scilab est gérée par une pile, il faut utiliser la fonction stacksize pour augmenter la taille de cette pile :

-->M=rand(1,10^7);//pas assez de place pour M
!--error 17
rand: stack size exceeded (Use stacksize function to increase it)


-->stacksize(10^8)//on augmente la taille de la pile

-->M=rand(1,10^7);//maintenant il y a assez de place

Cette pile (= la mémoire de scilab) est indexée par un pointeur qui ne peut prendre que 2^31 valeurs (grosso modo) on ne peut donc pas augmenter la taille de cette pile au delà de cette limite :

-->stacksize(10^9)
stacksize requested size is too big (max < 268435455)
!--error 112
Cannot allocate more memory

normalement cette limitation devrait disparaître dans les versions futures de scilab (5.x ou 6.x au plus tard).

Pour revenir à ton problème il faut savoir qu'il existe une deuxième pile qui est faite pour stocker les variables globales. Comme pour la mémoire courante, la taille de cette pile est modifiable (avec les mêmes limitations) en utilisant la fonction gstacksize(). Donc quand tu utilises gstacksize(n) tu modifies la taille de la pile des variables globales (et donc pas la mémoire courante) or tu n'utilises aucune variable globale donc cette modification n'a aucune incidence sur ton script :-)

conclusions :
1) commence ton script par stacksize(10^8) pour augmenter ton espace mémoire au maximum
2) repense ton script pour limiter le nombre de variables à manipuler (et consommer le moins de place mémoire dans des calculs intermédiaires)
3) si ça ne suffit pas il faudra attendra les version de scilab > 5.x pour voir disparaître cette limitation sur la taille de la pile ou te limiter à des images plus petites

Bonne chance,

Philippe.
0
Je te remercie pour les infos, je vais suivre tes conseils en espérant que ça marche...
Pour attendre la nouvelle version, ça va être dur sauf si elle sort très vite car mon stage n'attends pas ...
Merci!

Pitchu
0
Merci à toi et pardon de ne pas avoir répondu plus tôt mais j'étais vachement occupée avec le programme!
En tout cas, c'est super simpa de m'avoir aidée!

Pitchu
0