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

Collection et Stream Java Discussion :

Question de performance avec les HashMap


Sujet :

Collection et Stream Java

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Par défaut Question de performance avec les HashMap
    Bonjour à tous,

    Voici mon problème: je dispose d'une HashMap<String, ArrayList<Integer> et j'ai besoin de temps en temps de modifier une valeur au milieu de l'ArrayList.

    Or, je ne connais que la méthode put pour ce faire, mais le problème, c'est que si j'utilise put, je suis obligé d'écraser toute la ArrayList avec une nouvelle ArrayList, la même, mais avec une seule valeur modifiée.

    Et je soupçonne qu'au niveau des performances, ce ne soit pas le top, surtout que cette ArrayList contient plusieurs centaines de milliers de valeurs et que j'ai besoin de le faire dans une boucle qui tourne plusieurs centaines de milliers de fois.

    Auriez-vous une autre suggestion sans modifier la structure des HashMap?
    PS: j'ai dit ici que c'est une ArrayList, mais c'est en fait un objet customisé qui hérite des ArrayList.

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,

    Le passage de variable en java se fait par référence mais pas par valeur, donc si modifie un élément de l'ArrayList que tu as ajouté au HashMap, c'est déjà bon. Tu n'as plus besoin d'écraser la liste du map. Même si tu fais un put, cela ne changera rien s'il s'agit du même instance de l'ArrayList.

    A+.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Par défaut
    Merci pour ta réponse. Comment je peux faire sans écraser l'ArrayList comme tu dis?
    Surtout qu'il faille que je récupère l'ArrayList au préalable pour la modifier...
    Donc je suis obligé d'utiliser une nouvelle variable de type ArrayList!

  4. #4
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Donc je suis obligé d'utiliser une nouvelle variable de type ArrayList!
    Si tu as toujours la variable de départ, non, tu n'as qu'à modifier seulement l'élément que tu veux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    List<Machin> list = new ArrayList<Machin>();
    Machin x = new Machin();
    list.add(x);
    tonHashMap.put("cle",list);
    x.setMachin("test");//C'est bon
    //Mais si n'est pas une variable pointant sur l'objet, mais seulement la liste
    Machin y = list.get(index);
    y.setPropriete("propriete") ; // c'est bon 
    //Dans le cas ou tu n'as plus la variable que tu as inséré
    List a = tonHashMap.get("cle");
    Machin b = a.get(index);
    b.setPropriete("valeur"); // c'est bon
    A+.

  5. #5
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Et même s'il n'a plus la variable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    List<Machin> uneListe = tonHashMap.get("cle");
    if (null == uneListe) {
      uneListe = new ArrayList<Machin>();
      tonHashMap.("cle", uneListe);
    }
     
    uneListe.add("unTruc");
    Une liste n'est pas immutable, donc aucune contre-indication à modifier celle qui est dans la Hashmap, au contraire et ne surtout pas faire un nouveau put qui ne servirait à rien.

    Bulbo

    [Edit] En même temps si j'avais mieux lu, déjà proposé par andry.aime donc mon post est inutile
    [/Edit]
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Par défaut
    Merci à tous pour ces super explications.

    En effet, quand je fais hashmap.get(key).set(monIndex, maValeur), la modification se fait bien dans la HashMap. Je croyais que get générait une "copie" en mémoire de l'ArrayList à modifier et ne modifiait que celle-ci, mais en fait non.

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Par défaut
    Je me permets quand même de revenir vers vous pour une autre question dans le même projet:

    J'ai un fichier de 250000 chansons et 100000 utilisateurs. Je veux générer une matrice 100000x250000 qui ne contient que des 1 et des 0, pour calculer les similarités de chaque paire d'utilisateurs. Or, pour la calculer, j'ai besoin de l'intégralité de la "ligne" de la matrice de chaque utilisateur.

    Problème: ma matrice ne tient pas en mémoire. Elle atteint maximum 34152x19793 avant que le compilateur n'explose.

    J'ai pensé à "découper" la matrice en plusieurs matrices de 10000x10000 qui sont purgées une fois pleines, mais je pense que cela ne me permet pas d'obtenir ce que je veux puisque je dois avoir toute la ligne de mon utilisateur.

    J'ai aussi pensé à écrire les petites matrices dans un fichier et le relire après, mais je pense que cela va impacter les performances de mon programme.

    Auriez-vous une piste à me suggérer?

  8. #8
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    Si tu veux faire une matrice comme ça c'est donc que tu souhaites en tirer des statistiques ou des analyses de comportement

    c'est clairement un problème de base de données.

    Tu peux prendre une base embarquée genre Derby ou H2 ça ira très bien même avec les volumes que tu mentionnes
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  9. #9
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Par défaut

  10. #10
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    Citation Envoyé par User Name Voir le message
    Très original.

    A part cela, il te faudra 3 tables :
    - chansons -> liste des chansons avec un identifiant unique
    - utilisateurs -> liste des utilisateurs avec un identifiant unique
    - ecoute -> liste des identifiants chansons et utilisateurs
    sachant qu'on enregistre que les chansons ayant été écoutées.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Question d'élégance avec les templates.
    Par Agoudard dans le forum C++
    Réponses: 16
    Dernier message: 26/12/2010, 13h53
  2. Problème de performance avec les chunkedInputStream
    Par salimoo dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 02/08/2010, 19h33
  3. [Delphi 7] Questions pour débuter avec les bases de données
    Par DamKre dans le forum Bases de données
    Réponses: 6
    Dernier message: 25/09/2007, 16h06
  4. problemes de performances avec les requetes select
    Par berry dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/07/2003, 13h39
  5. problemes de performances avec les requetes select
    Par berry dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 10/07/2003, 13h39

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