Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1686 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Limitation de mémoire pour images entre 600lo et 2mo

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Limitation de mémoire pour images entre 600lo et 2mo

n°1432264
cocos2000
Posté le 27-08-2006 à 22:54:36  profilanswer
 

Bonjour, je fais une application pour manipuler des images sphériques au format jpg... J'utilise JAI entre autre... J'ai un problème de mémoire dès que je veux faire des opérations sur une image de plus de 600ko. Pourtant, j'ai paramétrer la JVM avec -Xms128mo et -Xmx 256mo, ce qui est largement surdimensionné à prirori.
Le message d'erreur est clair : Java.lang.OutOfMemory
Que faire ??
sinon, le système c'est : WindowsXP sp2, Jbuilder9.0, 512mo de ram...  
Merci beaucoup.

mood
Publicité
Posté le 27-08-2006 à 22:54:36  profilanswer
 

n°1432617
frabill
Posté le 28-08-2006 à 16:13:35  profilanswer
 

Fais une inspection de ton code, tu dois avoir des objets qui sont référencés et qui ne sont peuvent pas être éliminés par le GC.

n°1432728
cocos2000
Posté le 28-08-2006 à 20:17:06  profilanswer
 

et bien, je force meme le GC... en utilisant *.finalise()... et les contexte graphiques je les supprime avec *.dispose().. c'est assez propre comme code (pour une fois)... j'ai meme une erreur de dépassement de memoire en ne faisant que : ouvrir un JPG, puis enregistrer sous TIFF, j'utilise JAI car ca a l'air pratique pour le chagement de format.

n°1432729
cocos2000
Posté le 28-08-2006 à 20:17:23  profilanswer
 

Et merci en tous cas frabill...

n°1432730
cocos2000
Posté le 28-08-2006 à 20:18:49  profilanswer
 

Je me demande si ce n'est pas jBuilder qui contrain les capacités et les inscrits dans le fichier JAR que je crée pour la diffusion. Mais, les fichiers JAR, je ne maitrise pas trop.

n°1432734
el muchach​o
Comfortably Numb
Posté le 28-08-2006 à 20:29:44  profilanswer
 

Mais si tes objets sont tjrs référencés, le GC ne les collectera pas, même en le forçant et tu as un memory leak. Il faut mettre leurs références à null.
 
Lis ces articles:
http://www-128.ibm.com/developerwo [...] index.html
http://www-128.ibm.com/developerwo [...] 01246.html
 
Des Heap profilers peuvent t'aider à localiser le pb, comme http://appperfect.com/support/tuto [...] _leak.html


Message édité par el muchacho le 28-08-2006 à 20:31:35
n°1432736
cocos2000
Posté le 28-08-2006 à 20:36:09  profilanswer
 

ok, J'ai mis à null un maximum de références, pas toutes, je vais essayer ce que tu dis el muchado. merci.

n°1432739
el muchach​o
Comfortably Numb
Posté le 28-08-2006 à 20:48:01  profilanswer
 

Ok, dis-nous ce qu'il en devient. Et n'abuse pas des null non plus. Mieux vaut comprendre ce qui cause le leak.

n°1432777
cocos2000
Posté le 28-08-2006 à 22:30:18  profilanswer
 

bon... merci à tous. En fait, j'avais un dépassement de tableau de 1 qui état intercepté, le processus continuait, et là, ca explosait car les variables n'étaient plus définies. C'est une erreur qui m'arrive souvent, je l'ai tracée avec de nombre System.out.printn("la il se passe..." + var). Ce qui est bizarre, c'est que ce soit la mémoire qui soit mise en cause et pas simplement le dépassement... Merci à tous. J'ai exploré tes liens el muchacho, mais... j'ai relu mon code avant de m'engager dans un nouvel outil. Merci mille fois. Ca marche maintenant. tenez, en cadeaux, un petit logiciel pour faire des dessins animés. envoyez moi un mail et je vous le passe.

n°1432782
cocos2000
Posté le 28-08-2006 à 22:53:14  profilanswer
 

En fait, ca ne marche pas non plus, j'avais une variable de réduction de l'image qui résolvait le probleme. donc, il va falloir que je bricole avec les leak.. grrrrrrrr

mood
Publicité
Posté le 28-08-2006 à 22:53:14  profilanswer
 

n°1432785
frabill
Posté le 28-08-2006 à 23:04:01  profilanswer
 

Tu peux commencer par mettre des  
 

Code :
  1. Runtime.getRuntime().freeMemory();


 
à certains endroits du code pour voir comment l'occupation mémoire augmente, afin de cerner la portion de code en cause.


Message édité par frabill le 28-08-2006 à 23:04:29
n°1433365
cocos2000
Posté le 29-08-2006 à 20:36:36  profilanswer
 

j'essaie ca de suite..

n°1433492
cocos2000
Posté le 30-08-2006 à 08:55:27  profilanswer
 

L'erreur arrive, comme je m'en doutais au moment ou je créé un tableau int[9000000] correspondant à l'image RGB à traiter (3000x3000pixels).
En réduisant à 1000x1000 ca passe. mais une image de cette taille là, cela ne correspond plus au cahier des charges. je suis vraiment bloqué : je me dis que java est peut-etre limité pour le traitement des images... En cherchant, Photoshop traite avec un espace HD tampon. c'est peut-etre ce que je vais faire, mais ca va allourdir considérablement le programme. D'un autre côté, la capacité mémoire ne sera plus un problème... un avis ?

n°1433512
bobuse
Posté le 30-08-2006 à 09:21:02  profilanswer
 

Tu es sûr que c'est au moment de l'allocation de ton tableau que ça plante ? et que dit l'état de la mémoire juste avant. Car ce tableau me parait pas énorme ...

n°1433980
el muchach​o
Comfortably Numb
Posté le 30-08-2006 à 21:31:08  profilanswer
 

cocos2000 a écrit :

L'erreur arrive, comme je m'en doutais au moment ou je créé un tableau int[9000000] correspondant à l'image RGB à traiter (3000x3000pixels).
En réduisant à 1000x1000 ca passe. mais une image de cette taille là, cela ne correspond plus au cahier des charges. je suis vraiment bloqué : je me dis que java est peut-etre limité pour le traitement des images... En cherchant, Photoshop traite avec un espace HD tampon. c'est peut-etre ce que je vais faire, mais ca va allourdir considérablement le programme. D'un autre côté, la capacité mémoire ne sera plus un problème... un avis ?


Ah ben d'accord, tu aurais pu le dire plus tôt. :o
Du traitement d'images de cette taille-là, ça se fait tjrs par pavés de 500x500. C'est ce que font les logiciels de traitement d'image un peu sérieux. Tu ne pourras jamais faire du traitement sérieux avcec des images 3000x3000 chargées en RAM. C'est pas scalable, ta solution. Dès qu'on voudra mettre qqs filtres, tu vas faire péter la Heap.
 
Et oui, ça nécessite de concevoir tous les algos (et même un thread de calcul adhoc) de façon à ce qu'ils traitent par pavés, avec enregistrement sur disque au cours du calcul et éventuellement possibilité d'annuler en cours. Donc si on t'a demandé de faire ça, il faut prévoir le temps de développement qui va avec, parce qu'il n'y a pas d'autre solution (je le sais d'autant mieux que j'ai travaillé sur un tel logiciel. On pouvait faire du 10000x15000.)


Message édité par el muchacho le 30-08-2006 à 21:36:45
n°1434006
Taz
bisounours-codeur
Posté le 30-08-2006 à 21:52:21  profilanswer
 

3000 * 3000 * 4octets ça ne fait que 36meg et ça passe très bien.

n°1434063
cocos2000
Posté le 31-08-2006 à 01:01:38  profilanswer
 

merci el muchado, ce son de tres bons conseils, peut-etre pourrions nous voir cela ensemble... je ne suis que paysagiste et pas vraiment programmateur, donc, cela dépasse un peu mes compétences. MAis j'ia le temps.... si cela t'interesse dis le moi je t'en dirai bien plus.

n°1434066
nraynaud
lol
Posté le 31-08-2006 à 02:01:34  profilanswer
 

cocos > l'allocateur n'arrive pas à allouer un objet de cette taille à cause de la fragmentation de la mémoire (je rentre pas dans les détails).
 
tu peux tenter une feinte de l'ours en découpant ton tableau de pixels comme ça (sauf que je sais plus utiliser les arrays à plusieurs dimensions) :  

Code :
  1. class PixelHeap {
  2.   int heap[][] = new int[100][90000];
  3.   public int getPixel(int index) {
  4.     return heap[pixel/90000][pixel%90000];
  5. }


ce qui fait que la mémoire aura a chercher 100 places de 90000*4 octets de long plutôt qu'une seule place de 36Mo d'un coup.


Message édité par nraynaud le 31-08-2006 à 04:07:27

---------------
trainoo.com, c'est fini
n°1434581
cocos2000
Posté le 31-08-2006 à 19:57:30  profilanswer
 

merci nRaynaud, ca a l'air simple comme mise en place. J'essaie.

n°1434613
cocos2000
Posté le 31-08-2006 à 20:32:28  profilanswer
 

nRaynaud, j'ai codé ce que tu me dis, mais en fait, il me mets toujours la meme erreur... Je vais tenter le conseil de elMuchado.
Taz, comment fais-tu pour que ca passe ? tu as 3to de mémoire ?
 

n°1434618
cocos2000
Posté le 31-08-2006 à 20:34:31  profilanswer
 

elMuchado, je me demande un truc... j'arrive bien a charger une image de 3000x3000 pixel. comment se fait-il que la transformation en Integer ne se passe pas...

n°1434622
cocos2000
Posté le 31-08-2006 à 20:41:30  profilanswer
 

pour Bobuse : voila ce que ca marque  
 
> mémoire libre : 15423544
> tableau de calcul : int[9000000]
java.lang.OutOfMemoryError
 
les lignes commencant par ">" sont des formules calcullées avec ">memoire " + Runtime.getRuntime().freeMemory()" ou similaire

n°1434626
nraynaud
lol
Posté le 31-08-2006 à 20:44:21  profilanswer
 

cocos > ton -Xmx est à combien ?


---------------
trainoo.com, c'est fini
n°1434632
cocos2000
Posté le 31-08-2006 à 20:50:33  profilanswer
 

Voici ce que ca doit faire (pour une image de taille réduite):
image initiale :                            image finale :
http://www.paysages.org/VRACS/DESSINS/Image_initiale.jpg  http://www.paysages.org/VRACS/DESSINS/Image_finale.jpg

Message cité 1 fois
Message édité par cocos2000 le 31-08-2006 à 20:54:56
n°1434636
cocos2000
Posté le 31-08-2006 à 20:53:09  profilanswer
 

nRaynaud, mon -Xmx est à 400mo, je n'ai que 512 de ram.. donc je laisse quelques méga pour windows... je n'ai pas essayé de bloqué au max.

n°1434677
cocos2000
Posté le 31-08-2006 à 21:12:08  profilanswer
 

bon, je désespere. Ca marche avec une image de 1700 x 1700 pix..
on va s'arreter là, je ne sais pas faire. voila la différence entre un VRAI programmeur et un programmeur du dimanche ...

n°1434745
nraynaud
lol
Posté le 31-08-2006 à 22:25:47  profilanswer
 

coco > tente de fragmenter plus, genre  
 int heap[][] = new int[1000][9000];


---------------
trainoo.com, c'est fini
n°1434778
cocos2000
Posté le 31-08-2006 à 23:10:22  profilanswer
 

nRaynaud... non, ca ne marche vraiment pas. En fait, au début je fragmentait l'image comme ca sans le savoir. Maintenant, elle n'est plus fragmentée...

n°1434820
the real m​oins moins
Posté le 01-09-2006 à 03:29:18  profilanswer
 

cocos2000 a écrit :

Voici ce que ca doit faire (pour une image de taille réduite):
image initiale :                            image finale :
http://www.paysages.org/VRACS/DESS [...] itiale.jpg  http://www.paysages.org/VRACS/DESSINS/Image_finale.jpg


c'est la fameuse transformation de Goatse, ton algo? [:klem3i1]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°1434827
nraynaud
lol
Posté le 01-09-2006 à 07:51:54  profilanswer
 

nan, s'il est paysagiste, il doit prendre une foto de son jardin avec un fisheye tourné vers le haut et il essaye de transformer en clindrique après, probablement pour quicktime VR.


---------------
trainoo.com, c'est fini
n°1434828
el muchach​o
Comfortably Numb
Posté le 01-09-2006 à 07:53:21  profilanswer
 

cocos2000 a écrit :

elMuchado, je me demande un truc... j'arrive bien a charger une image de 3000x3000 pixel. comment se fait-il que la transformation en Integer ne se passe pas...


Honnêtement, je ne sais pas. Ce qui est certains, c'est que tu crées 9 000 000 d'objets d'un coup, et il se peut que ça fragmente la mémoire, même si j'en doute parce que les GC sophistiqués gèrent cela très bien.
 

Citation :

bon, je désespere. Ca marche avec une image de 1700 x 1700 pix..
on va s'arreter là, je ne sais pas faire. voila la différence entre un VRAI programmeur et un programmeur du dimanche ...


 
N'abandonne pas, c'est pas forcément facile, mais c'est un challenge intéressant. Ceci dit, on n'a pas forcément de réponse toute prête. Essaye de faire comme je t'ai dit sur une image 100x100 que tu divises en pavés de 50x50, avec des traitements simples qui fonctionnnent par pavé.

Message cité 1 fois
Message édité par el muchacho le 01-09-2006 à 08:09:28
n°1434901
bobuse
Posté le 01-09-2006 à 10:17:51  profilanswer
 

Ou peut-être qu'il faut changer de langage  [:spamafote]

n°1435058
the real m​oins moins
Posté le 01-09-2006 à 12:46:56  profilanswer
 

el muchacho a écrit :

N'abandonne pas, c'est pas forcément facile, mais c'est un challenge intéressant.

euh [:totozzz]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°1435183
Taz
bisounours-codeur
Posté le 01-09-2006 à 15:29:53  profilanswer
 

cocos2000 a écrit :

Taz, comment fais-tu pour que ca passe ? tu as 3to de mémoire ?

rien de spécial mais ça passe. Colle ton -Xmx à donf. Je ne sais pas comment fait Sun java, mais si mx est une taille de mémoire virtuelle, alors tu peux très vite y monter.
 
Tu peux peut-être jouer avec -verbose:gc voir ce qui se passe avant ton plantage ?

n°1435458
el muchach​o
Comfortably Numb
Posté le 01-09-2006 à 23:52:57  profilanswer
 

bobuse a écrit :

Ou peut-être qu'il faut changer de langage  [:spamafote]


Non, je dirais qu'à priori il n'y a aucune raison. Il vaudrait mieux qu'il nous donne un bout de code (la structure des données après lecture de l'image et l'algo de traitement qui fait péter) et qu'il fasse un profilage de la Heap pour voir ce qui cloche, parce qu'il y a clairement qq chose qui cloche.
 
Taz> 3000x3000 ça fait 36 Mo, mais 5000x5000 ça en fait tout de suite 100. Après, faut voir si il a besoin d'autant.
 
cocos2000> D'ailleurs je vois que JAI implémente le traitement d'images par pavés "Tiles", avec des opérateurs simples sur les images que l'on peut combiner dans un pipeline, comme il convient de faire.
 
A mon avis, tu devrais essayer de suivre le tutorial sur l'utilisation de JAI, tu ne l'utilises pas correctement, à l'évidence. Et cette API est visiblement compliquée à utiliser correctement. Tu ne devrais pas avoir à traiter des images 3000x3000 d'un seul bloc.
 
Autre tutoriel bien foutu: http://www.inf.ufrgs.br/~revista/d [...] utorial%22


Message édité par el muchacho le 02-09-2006 à 00:24:23
n°1435594
cocos2000
Posté le 02-09-2006 à 13:00:27  profilanswer
 

bon... je vais vous dire à quoi ca sert : il s'agit, à partir d'une image fisheye, prise verticalement - bien vu. Ce n'est pas de faire un QuickTime VR, il ya des programmes pour ca. Il s'agit juste de faire cette transformation, d'enregister l'image et de la caller dans un Système d'information géographique, à la coordonnée du point de vue, repéré par GPS. Comme ca, on a on la carte au centre, et tout ce que l'on voit depuis ce point la.

n°1435656
el muchach​o
Comfortably Numb
Posté le 02-09-2006 à 16:27:06  profilanswer
 

J'ai rien compris. [:le kneu]
Quel est l'intérêt d'une image complètement déformée par rapport à un panoramique de photos ? Et cette histoire de carte au centre, de GIS avec des photos distordues (parce que vu le taux de distortion, je doute qu'on puisse un jour arriver à qq chose de potable, d'ailleurs, l'exemple au-dessus est assez significatif, c'est à peine lisible), etc.
Bref...


Message édité par el muchacho le 02-09-2006 à 16:32:05
n°1435838
cocos2000
Posté le 03-09-2006 à 11:05:05  profilanswer
 

Ok... c'est un peu comme une image d'échographie... on ne comprend pas grand chose quand on la regarde comme une image "normale". ... pas de problème !!
Merci en tous cas a vous de l'aide et des conseils. Je vais aviser et peut etre sollicité la cellule informatique de la boite. ils doivent avoir une idée pour faire ca.

n°1443466
cocos2000
Posté le 16-09-2006 à 19:47:31  profilanswer
 

Bon... ca y est, ca marche. j'ai revu tout le code. Il y avait une redondance entre 2 images bufferisées, et un fichier en mémoire. Ca marche donc jusqu'à une certaine taille, qui me suffit (3000x3000pix).
Reste un problème : comment configurer la JVM dans un JAR pour passer par exemple les paramètres -Xms et -Xmx ?

n°1443496
Taz
bisounours-codeur
Posté le 16-09-2006 à 22:50:25  profilanswer
 

tu peux pas, vu que .class ou .jar, tu lances toujours 'java ... machin'. Livre un script avec

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Limitation de mémoire pour images entre 600lo et 2mo

 

Sujets relatifs
[C Sharp/Résolu] mémoire et sauts pointeurs: la chasse au gaspiComment creer un diaporama avec liens textes et images ?
Win api : programme qui plante à cause des imagesChemin des images
Mémoire insuffisanteComment organiser les images dans un package ?
Limitation à 10Mo en uploadAugmentation allocation mémoire en Fortran
sujet de mémoireLibération de la mémoire
Plus de sujets relatifs à : Limitation de mémoire pour images entre 600lo et 2mo


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR