[Users-fr] Afficher une image de 2048 par 2048

classic Classic list List threaded Threaded
12 messages Options
laurent berger laurent berger
Reply | Threaded
Open this post in threaded view
|

[Users-fr] Afficher une image de 2048 par 2048

Bonjour,

J'essaye d'afficher une image 2048x2048 à partir du programme suivant  
en utilisant le module IPD ou SIVP
clear;
stacksize('max');
n=10;// n=11 que des problèmes
nbl=2^n;nbc=2^n;
yc=nbl/2;xc=nbc/2;
x=zeros(nbl,nbc);
[i,j]=meshgrid(1:nbl,1:nbc);
d=abs(i-yc)+abs(j-xc);
x=d;

ww=2;
if ww==0 then
     figure(0);clf();
     grayplot(1:nbl,1:nbc,x)
     f=gcf();
     f.color_map=rand(256,3);

end
if ww==1
     figure(0);clf();
     ShowImage(x,'test',rand(256,3));
end
if ww==2
     imshow(x/256);
end

***Avec IPD (showimage ww=1) pour n=10 cela marche, n=11 :
Warning !!!
Scilab has found a critical error (EXCEPTION_ACCESS_VIOLATION)
with "Matplot" function.
Save your data and restart Scilab.

***Avec le module sip (ww=2) c'est pareil, j'ai le même problème.
TCL_EvalFile, à la ligne 38 du fichier  
C:\Users\LAUREN~1\AppData\Roaming\Scilab\SCILAB~1.0\atoms\x64\SIVP\053~1.1-2\macros/imshow.tcl
        truncated PPM data
     while executing
"tkimage put  $imagedata"
     (file  
"C:\Users\LAUREN~1\AppData\Roaming\Scilab\SCILAB~1.0\atoms\x64\SIVP\053~1.1-2\macros/imshow.tcl" line  
38).
at line      36 of function imshow called by :
     imshow(x/256);
at line      24 of exec file called by :

***Avec grayplot pour n=11 (ww=0), il n'y a pas d'image visible et avec n=12
Exception in thread "Thread-96" javax.media.opengl.GLException:  
java.lang.reflect.InvocationTargetException
        at javax.media.opengl.awt.GLJPanel.display(GLJPanel.java:265)
        at  
org.scilab.forge.scirenderer.implementation.jogl.JoGLCanvas$CanvasAnimator.run(Unknown  
Source)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
        at java.awt.EventQueue.invokeAndWait(Unknown Source)
        at javax.media.opengl.awt.GLJPanel.display(GLJPanel.java:263)
        ... 2 more
Caused by: java.lang.OutOfMemoryError: Direct buffer memory
        at java.nio.Bits.reserveMemory(Unknown Source)...........


Donc comment faire?
De plus en zoomant l'image on constate que l'image est interpolée.  
Peut-on enlever cette interpolation qui doit être très gourmande en  
mémoire?

Merci de vos réponses.


scilab 5.4.0 (64-bit) windows 7 64bit  avec 8Gb de ram




_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr
Samuel GOUGEON Samuel GOUGEON
Reply | Threaded
Open this post in threaded view
|

Re: Afficher une image de 2048 par 2048

Le 28/02/2013 22:55, Laurent Berger a écrit :
.../...
Donc comment faire?

 - Eviter la multiplication des variables intermédiaires très encombrantes
 - Se souvenir que le contenu de Matplot est interprété comme des indices
   de couleurs dans la palette de la fenêtre graphique.
:
stacksize(4e7);
gstacksize(4e7);
n = 10;
n = 11 // que des problèmes
nbl = 2^n;
nbc = 2^n;
yc = nbl/2;
xc = nbc/2;
x = zeros(nbl,nbc);
x = meshgrid(1:nbl,1:nbc);
x = abs(x-yc)+abs(x'-xc);

clf
f = gcf();
f.color_map=rand(256,3);
Matplot(pmodulo(x,256))


Samuel


_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr
laurent berger laurent berger
Reply | Threaded
Open this post in threaded view
|

Re: Afficher une image de 2048 par 2048

Merci de ta réponse mais je suis un peu sceptique.
"- Eviter la multiplication des variables intermédiaires très encombrantes"
à mon avis pmodulo génère une varaible intermédiaire de la taille de x
" Se souvenir que le contenu de Matplot est interprété comme des indices
   de couleurs dans la palette de la fenêtre graphique."
Il me semble que les fonctions grayplot et  showimage  utilisent aussi la notion de palette.

Pour en revenir au programme pour n=10 l'espace mémoire occupé par x est 2^10*2^10*8=8388624octets soit à peu près 8Mo et de même pour i,j,d soit environ 32Mo pour les variables
Si on passe à n=12 2^12*2^12*8=1.342D+08octets soit  environ pour les variables x,i,j, d soit environ 512Mo
Donc sauf erreur dans les calculs précédents avec un ordinateur avec 8Go et un système 64 bits et scilab 64 bits (La machine virtuelle java est elle en 64 bits?), il reste encore 6Go pour afficher l'image.
Il y a quelque chose qui m'échappe.
Samuel GOUGEON Samuel GOUGEON
Reply | Threaded
Open this post in threaded view
|

Re: Afficher une image de 2048 par 2048

Bonjour Laurent,

>>- Eviter la multiplication des variables intermédiaires très encombrantes"
>à mon avis pmodulo génère une varaible intermédiaire de la taille de x

Probablement, mais la mémoire est libérée à sa sortie.
Dans ton exemple initial, i, j, d et x sont toutes (n,n) et en session.


>>" Se souvenir que le contenu de Matplot est interprété comme des indices
>>   de couleurs dans la palette de la fenêtre graphique."
>Il me semble que les fonctions grayplot et  showimage  utilisent aussi la
>notion de palette.*

oui, mais sans le modulo, on obtient la couleur de saturation, car ~tous
les éléments de la matrice sont >>256.

>Pour en revenir au programme pour n=10 l'espace mémoire occupé par x est
>2^10*2^10*8=8388624octets soit à peu près 8Mo et de même pour i,j,d soit
>environ 32Mo pour les variables
>Si on passe à n=12 2^12*2^12*8=1.342D+08octets soit  environ pour les
>variables x,i,j, d soit environ 512Mo
>Donc sauf erreur dans les calculs précédents avec un ordinateur avec 8Go et
>un système 64 bits et scilab 64 bits (La machine virtuelle java est elle en
>64 bits?), il reste encore 6Go pour afficher l'image.
>Il y a quelque chose qui m'échappe.

oui, même avec toute l'attention requise pour utiliser stacksize() et gstacksize()
qui prennent des arguments en nombres de "mots longs" (j'ai cru comprendre qu'il
s'agit de nombres en double précision, ie des multiples de 8 octets, unité très
peu pratique...), le résultat de ces calculs de mémoire laisse perplexe...
Du reste, peut-être est-ce ce facteur 8 très peu lisible qui pose problème
dans la routine stacksize()...

Mais tu demandais à afficher une image 2048x2048. C'est possible !
;)

Samuel
_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr
Samuel GOUGEON Samuel GOUGEON
Reply | Threaded
Open this post in threaded view
|

Re: Afficher une image de 2048 par 2048

In reply to this post by laurent berger
>Si on passe à n=12 2^12*2^12*8=1.342D+08octets soit  environ pour les
>variables x,i,j, d soit environ 512Mo

Je crois me souvenir que Scilab < 6 est limité à 100 ou 200Mo...
Et que la gestion de la mémoire vive utilisable est complètement mise
à plat dans Scilab 6, en étant seulement limitée par l'ordinateur.
Une occasion d'essayer Scilab 6 (dit YAS), si Matplot y est déjà branché.

Samuel
_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr
Samuel GOUGEON Samuel GOUGEON
Reply | Threaded
Open this post in threaded view
|

Re: Afficher une image de 2048 par 2048

In reply to this post by Samuel GOUGEON
>>LB: .../...
>>Si on passe à n=12 2^12*2^12*8=1.342D+08octets soit  environ pour les
>>variables x,i,j, d soit environ 512Mo
>>Donc sauf erreur dans les calculs précédents avec un ordinateur avec 8Go et
>>un système 64 bits et scilab 64 bits (La machine virtuelle java est elle en
>>64 bits?), il reste encore 6Go pour afficher l'image.
>>Il y a quelque chose qui m'échappe.

>SG: .../...
>Du reste, peut-être est-ce ce facteur 8 très peu lisible qui pose problème
>dans la routine stacksize()...

Par ailleurs, Matplot, et la grayplot family souffr(ai)ent d'importantes
fuites de mémoires. Divers correctifs y ont été apportés depuis la
publication de 5.4.0 à la rentrée dernière (voir CodeReview).
Essayer avec la version en cours de développement (il y en a 3: 5.4.x, 5.5,
et master ! => laquelle choisir ?) améliorerait peut-être la situation.
_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr
laurent berger laurent berger
Reply | Threaded
Open this post in threaded view
|

Re: Afficher une image de 2048 par 2048

Bon j'ai lu la doc!
Dans la doc de stacksize il y a :
"Pour les plateformes 64 bit, la taille maximale de la pile est limitée à 268 435 454."
Soit 2Gb en multipliant par 8 (taille des réels de type double).
Pour l'exemple avec une image de 4096x4096 les variables seuls occupent 512Mo selon mes calculs et confirmer par la variable whos. Avec le gestionnaire de windows je constate que scilab passe à 2Go après stacksize('max'). c'est la limitation mémoire de la JVM 32 bits je crois bien. Ma conclusion c'est que la fonction whos indique que les variables occupent 512 Mo donc il manque 1.5Go
La plus grande matrice que je peux utiliser est de 14900*14900*8 soit environ 1.7Go.
En résumé il vaut mieux avoir deux programmes un pour le calcul et un pour l'affichage lorsqu'on doit manipuler des matrices de taille supérieure à 1000x1000
Sylvestre Ledru-4 Sylvestre Ledru-4
Reply | Threaded
Open this post in threaded view
|

Re: Afficher une image de 2048 par 2048

In reply to this post by Samuel GOUGEON
On 01/03/2013 11:16, [hidden email] wrote:

>>> LB: .../...
>>> Si on passe à n=12 2^12*2^12*8=1.342D+08octets soit  environ pour les
>>> variables x,i,j, d soit environ 512Mo
>>> Donc sauf erreur dans les calculs précédents avec un ordinateur avec 8Go et
>>> un système 64 bits et scilab 64 bits (La machine virtuelle java est elle en
>>> 64 bits?), il reste encore 6Go pour afficher l'image.
>>> Il y a quelque chose qui m'échappe.
>
>> SG: .../...
>> Du reste, peut-être est-ce ce facteur 8 très peu lisible qui pose problème
>> dans la routine stacksize()...
>
> Par ailleurs, Matplot, et la grayplot family souffr(ai)ent d'importantes
> fuites de mémoires. Divers correctifs y ont été apportés depuis la
> publication de 5.4.0 à la rentrée dernière (voir CodeReview).
> Essayer avec la version en cours de développement (il y en a 3: 5.4.x, 5.5,
> et master ! => laquelle choisir ?) améliorerait peut-être la situation.
Ces travaux ont été fait dans la branche 5.4. Ils seront donc
disponibles en 5.4.1 et testable ici:
http://www.scilab.org/development/nightly_builds/5.4

Sylvestre

_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr
Samuel GOUGEON Samuel GOUGEON
Reply | Threaded
Open this post in threaded view
|

[Users-fr] Dimensionner la pile Java <= Re: Afficher une image de 2048 par 2048

In reply to this post by laurent berger
Le 01/03/2013 12:09, laurent berger a écrit :
.../...
c'est la limitation mémoire de la JVM 32 bits je crois bien. 
La pile utilisable par Java est dimensionnée dans le fichier SCI\etc\jvm_options.xml :
<!-- Set Java Heap space to 256mb -->
<option value="-Xmx256m"/>

En augmentant (par exemple à 700m) la valeur indiquée, l'exception java
n'a plus lieu, la figure est produite sans émettre d'erreur (axes gradués, handle
contenant la matrice), mais la matrice elle-même ne s'affiche pas:
stacksize(15e7);
//gstacksize(1e7);
clf
n = 12;		// 4096 x 4096
n = 2^n;
x = zeros(n,n);
x = meshgrid(1:n,1:n);
x = abs(x-n/2)+abs(x'-n/2);
f = gcf();
f.color_map = rand(256,3);
Matplot(pmodulo(x,256))

Samuel


_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr
Samuel GOUGEON Samuel GOUGEON
Reply | Threaded
Open this post in threaded view
|

Re: Afficher une image de 2048 par 2048

In reply to this post by laurent berger
Le 28/02/2013 22:55, Laurent Berger a écrit :
.../...
De plus en zoomant l'image on constate que l'image est interpolée. Peut-on enlever cette interpolation qui doit être très gourmande en mémoire?

L'interpolation n'est plus observable avec Scilab 5.4.1 (courant)(zoom ci-après):


SG


_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr
Samuel GOUGEON Samuel GOUGEON
Reply | Threaded
Open this post in threaded view
|

Re: Afficher une image de 2048 par 2048

In reply to this post by laurent berger
Le 01/03/2013 12:09, laurent berger a écrit :
.../...c'est la limitation mémoire de la JVM 32 bits je crois bien. 
Inutile de modifier le fichier SCI\etc\jvm_options.xml : La taille mémoire
dédiée à JVM est paramétrable dans les Préférences => Général : Mémoire du tas Java.
En passant par les Préférences (à 700 MB), ça fonctionne avec une matrice 4096x4096 :


stacksize(15e7);
clf
n = 12;
n = 2^n;
x = zeros(n,n);
x = meshgrid(1:n,1:n);
x = abs(x-n/2)+abs(x'-n/2);
f = gcf();
f.color_map = rand(256,3);
Matplot(pmodulo(x,256))

! 
Samuel


_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr
laurent berger laurent berger
Reply | Threaded
Open this post in threaded view
|

Re: Afficher une image de 2048 par 2048

Bonsoir,

J'avais essayé de toucher aux paramètres de la JVM. ma conclusion est que cela ne sert pas à grand chose pour les grands tableaux (taille du tas maximal : 1/4 de la mémoire physique limité à 1Go [www.jmdoudoux.fr/java/dej/chap-gestion_memoire.htm#gestion_memoire-6] )
D'ailleurs si on règle le tas à 64Mb pour valeur initiale la jvm utilisera je pense l'espace restant 2Gb avec la jvm  au mieux des besoins.
Avec le programme en bas du message, je vois l'image avec n=11, je ne vois rien avec n=12 et n=13 mais il n'y a plus d'erreur mémoire. Les données sont bonnes car lorsque l'on trace plot(x(128,:)) on a bien des marches.
Il y a encore quelques problèmes dans matplot :
stacksize('max');clear;clf();N=1185;Matplot(rand(N,N)*256)
Le jeu Quelle est la plus grande valeur de N qu'accepte la fonction MatPlot?
Je n'ai pas réussi après N=1196...

clear;
stacksize('max');
n=13;
nbl=2^n;nbc=2^n;
x=zeros(nbl,nbc);
for i=1:nbl
    x(i,:)=floor((1:2^n)/2^(n-7));
end
for j=1:nbc
    x(:,j)=x(:,j)+floor((1:2^n)'/2^(n-7));
end

    Matplot(x);
    f=gcf();
    f.color_map=rand(256,3);



Ma configuration est
-->ver
 ans  =
 
!Scilab Version:             5.4.1.1362086720                                                !
!                                                                                            !
!Operating System:           Windows 7 6.1                                                   !
!                                                                                            !
!Java version :              1.6.0_32                                                        !
!                                                                                            !
!Java runtime information :  Java(TM) SE Runtime Environment (build 1.6.0_32-b05)            !
!                                                                                            !
!Java vm information :       Java HotSpot(TM) 64-Bit Server VM (build 20.7-b02, mixed mode)  !
!                                                                                            !
!Vendor specification:       Sun Microsystems Inc.                                           !