Précédent   Forum des professionnels en informatique > Java > Général Java > Langage
Langage Forum d'entraide sur le langage Java et autres langages pour la JVM : syntaxe, POO, conventions, API standard. Avant de poster -> FAQ Java
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/01/2012, 15h03   #1
Membre régulier
 
Inscription : février 2007
Messages : 147
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 147
Points : 80
Points : 80
Par défaut Ensemble contenant peu d'éléments

Bonjour,

J'ai à manipuler beaucoup d'ensembles (quelques millions) qui ont une petite taille (typiquement 2 ou 3 éléments; quelques centaines dans le pire des cas).

Par habitude, j'ai utilisé un HashSet mais j'ai des problème de mémoire. En effet, sa capacité est initiale est de 16. Dans mon cas, j'en conclut que typiquement 13/14 espaces mémoires sont utilisés mais vide. Et 13*1 000 000, cela fait beaucoup.

Du coup, j'ai envie de diminuer la taille par défaut. Par exemple, je peux prendre la valeur 2. J'ai du mal à évaluer les conséquence de ce choix. Avez-vous du feedback à partager?

Y-a-t-il d'autres choix possibles?

Merci de votre aide.
LGnord est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 15h14   #2
Membre Expert
 
Homme
Développeur java, access, sql server
Inscription : octobre 2005
Messages : 851
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 : 851
Points : 1 302
Points : 1 302
quelques millions ...

Ces quantités sont habituellement plutôt traitées par une base de données.
- Quels sont les éléments de ces ensembles ?
- Quels types de traitements sur les éléments / ensembles ?
__________________
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser.
First, make it work. Then, make it fast. Finally, make it user-friendly.
Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich.
Népomucène est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 15h35   #3
Membre régulier
 
Inscription : février 2007
Messages : 147
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 147
Points : 80
Points : 80
Merci de ton aide.

D'abord mes ensembles contiennent des entiers.

J'ai deux actions sur les ensembles:
- ajouter un élément (au sens d'un ensemble i.e. je ne veux pas de doublon),
- itérer sur tous les éléments.

Concrètement, je représente un automate (faiblement) non déterministe. Je stocke donc des règles du style:
état --- transition ----> ensemble d'états
LGnord est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 15h59   #4
Membre Expert
 
Homme
Développeur java, access, sql server
Inscription : octobre 2005
Messages : 851
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 : 851
Points : 1 302
Points : 1 302
La base de donnée peut répondre à ce problème
(capable de refuser les doublons)
et aussi pour l'itération.

Il y aura un petit travail d'optimisation à prévoir mais bon ...
__________________
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser.
First, make it work. Then, make it fast. Finally, make it user-friendly.
Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich.
Népomucène est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 16h22   #5
Membre régulier
 
Inscription : février 2007
Messages : 147
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 147
Points : 80
Points : 80
Merci pour ton aide.

Je garde l'idée de la base de données sous le coude mais j'aimerai l'éviter. Elle va à contre courant que ce que nous voulons faire.
LGnord est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 16h27   #6
Membre Expert
 
Homme
Développeur java, access, sql server
Inscription : octobre 2005
Messages : 851
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 : 851
Points : 1 302
Points : 1 302
as-tu vu qu'en lançant ton application, tu peux demander à la JVM d'augmenter la mémoire utilisée :
__________________
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser.
First, make it work. Then, make it fast. Finally, make it user-friendly.
Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich.
Népomucène est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 16h42   #7
Membre régulier
 
Inscription : février 2007
Messages : 147
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 147
Points : 80
Points : 80
Oui, je suis déjà au max de ce que mon ordi peut supporter.
LGnord est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 17h38   #8
Modérateur
 
Avatar de dinobogan
 
Homme Dinobogan Shelashyn
ingénieur étude et développement
Inscription : juin 2007
Messages : 3 273
Détails du profil
Informations personnelles :
Nom : Homme Dinobogan Shelashyn
Âge : 31
Localisation : France

Informations professionnelles :
Activité : ingénieur étude et développement
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2007
Messages : 3 273
Points : 4 881
Points : 4 881
Les traitements que tu as à effectuer ne sont pas très clair. tu pourrais peut-être imaginer faire un Graphe par toi-même ? Donc plus de HashSet avec les nombreux trous.
Reste à voir si la vérification d'unicité se fait une fois pour toute au démarrage ou pas. Si c'est tout au long de la durée de vie du programme, il faudrait peut-être voir à stocker les données dans une liste maintenue triée avec recherche dichotomique pour savoir si une valeur existe déjà.
__________________
Que la force de la puissance soit avec le courage de ta sagesse.
dinobogan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 00h15   #9
Modérateur
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 16 197
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 16 197
Points : 25 343
Points : 25 343
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
Clairement, si t'as un million de structures généralement petites, oublie les structures complexe comme les objet. Pour chaque entier sotcké dans le set tu va créer un wrapper (Integer), tu va devoir avoir la structure du set en lui même et son espace de stockage. Un HashSet, en plus, utiliser un table de hashage et des listes chainée. Un hashset occupe donc beaucoup plus d'espace en mémoire qu'un simple tableau. Quand on regarde sur le net, on estime qu'un "grand tableau" occupe à peu près la place des données qu'il contient. Par contre, un hashset, pour y stocker des primitif, on en arrive à un facteur 20.
Bref, un hashset avec beaucoup d'entier occupe environ 20x plus de mémoire qu'un tableau de la même quantité d'entiers.
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
"Votre génitrice tute des pédoncules au pandémonium" (le conjurateur, 1973)
tchize_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 09h29   #10
Membre régulier
 
Inscription : février 2007
Messages : 147
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 147
Points : 80
Points : 80
Citation:
Bref, un hashset avec beaucoup d'entier occupe environ 20x plus de mémoire qu'un tableau de la même quantité d'entiers.
C'est une information qui m'est super utile.

Merci pour ton aide.
LGnord est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2012, 10h43   #11
Membre régulier
 
Inscription : février 2007
Messages : 147
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 147
Points : 80
Points : 80
Je marque le sujet comme résolu car l'idée de tchize m'a permis de faire un très grand pas en avant.

Néanmoins, si quelqu'un a une autre idée, je continue ma veille.
LGnord est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h12.


 
 
 
 
Partenaires

Hébergement Web