IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

(Grosse) lenteur d'algorithme de détection de pixels contigus


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 6
    Points : 4
    Points
    4
    Par défaut (Grosse) lenteur d'algorithme de détection de pixels contigus
    Bonjour à tous,

    Je développe actuellement -à titre personnel- un algorithme de détection des pixels contigus dans une image. Voici son fonctionnement simplifié, pour l'exploration d'une zone de l'image:

    On créée un objet "cellule" défini par un attribut (String), ses coordonnées (int), les coordonnées de son père (int).
    On appelle sa méthode 'Rayonne', qui créée de nouveaux objets "cellule" dans une direction donnée de l'espace (Up Down Right Left) si la case connexe correspondante répond à certaines conditions.
    Si aucune de ces conditions n'est remplie, cette case met à jour le tableau (boolean) de suivi de son père.
    Lorsque le tableau est complet, le père met à jour le tableau de son propre père, et ainsi de suite jusqu'à la case d'attribut "Main" qui n'a pas de père.
    Lorsque le tableau de suivi de "Main" est complet, c'est que toute la zone a été explorée.

    Les coordonnées des cellules sont stockées dans un ArrayList<String>. (int x+","+int y)

    Cet algorithme fonctionne parfaitement sur des zones restreintes (2500 px ça va encore), mais dès que l'on augmente la taille de la zone à explorer, l'appli rame un maximum et finit par se bloquer (Ctrl Alt Suppr nécessaire).

    Ma question:
    Est-ce parce que j'ai utilisé des ArrayList ?
    Est-ce parce qu'il y a trop d'objets créés ?
    Est-ce à cause d'une autre raison ?

    Merci!

    > Uncle Bobo

  2. #2
    Membre expert
    Avatar de moritan
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2005
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2005
    Messages : 687
    Points : 3 135
    Points
    3 135
    Par défaut
    Tu n'aurais pas un problème de mémoire? pas sur car tu n'as pas d'ereur outOfmemory, mais bon...

    Par contre si j'ai bien compris ton explication, ton algo fait que tu traites toutes tes cellules 3 fois au moins, avec la méthode rayonne. As-tu du cache sur les valeurs de tes cellules ou pas?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Non elles ne sont pas traitées 3 fois, car je vérifie avant de créer une nouvelle cellule que la case à explorer n'a pas déjà été explorée auparavant (je créée un tableau 2D de "cellule" qui se remplit à chaque nouvelle création d'objet).

    "As-tu du cache sur les valeurs de tes cellules ou pas?"
    => Du quoi ?

  4. #4
    Membre expert
    Avatar de moritan
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2005
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2005
    Messages : 687
    Points : 3 135
    Points
    3 135
    Par défaut
    Citation Envoyé par uncle bobo
    "As-tu du cache sur les valeurs de tes cellules ou pas?"
    => Du quoi ?
    Je te demandé si tu stockais quelque part tes objets cellules (un tableau par ex ) pour les retrouver les valeurs facilement sans recalculer et multiplier le nombre d'objet.

    as-tu essayer de supprimer les cellules inutile de ton tableau?
    A la 3e ligne la 1ere ne sert plus à rien passé ses objets à null donnerait de la place pour le GC.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Le problème, c'est que l'appel de l'objet parent se fait justement par l'intermédiaire de ce tableau de "cellule".
    Si je supprime mes objets du tableau au fur et à mesure, je ne pourrais plus actualiser leurs tableaux de suivi par la suite.

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Je ne me suis pas penche en details sur la description sur probleme, mais a priori pour le stockage j'utiliserai plutot une Map<Integer, List<Point>> ou la cle est le numero de la zone et la List<Point> est en fait une LinkedList<Point> du moins pendant le travail de recherche (car on ne sait pas combien de points on va trouver). Libre a toi de la transformer en ArrayList<Point> tout a la fin de la recherche quand on a tout trouve.

    On peut aussi utiliser une Map<Integer, Map<Point, Point>> (note : cle et valeurs sont alors identiques) ce qui permet de plus rapidement detecter (temps de la methode containsKey()) si on repasse sur une point deja traite, mais c'est un poil initule car si l'algorithme d'innondation est correctement fait, il traite ca deja de lui-meme et donc ne necessite pas d'appeler containsKey() ou contains()..
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. Grosse lenteur en debug sous Delphi 7
    Par HooK dans le forum Delphi
    Réponses: 3
    Dernier message: 26/07/2007, 12h36
  2. Réponses: 1
    Dernier message: 07/03/2007, 09h28
  3. Algorithme de détection de différences entre arbres
    Par GrandFather dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 02/03/2006, 18h34
  4. Grosse Grosse lenteur
    Par Guttata dans le forum Windows XP
    Réponses: 13
    Dernier message: 03/08/2005, 08h31
  5. Installation 10g : grosses lenteurs
    Par P@t dans le forum Oracle
    Réponses: 4
    Dernier message: 29/06/2004, 22h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo