Gerer et stocker un très grand nombre de String

Fermé
neocol Messages postés 63 Date d'inscription mardi 4 juin 2013 Statut Membre Dernière intervention 6 février 2016 - Modifié par neocol le 17/03/2014 à 01:49
neocol Messages postés 63 Date d'inscription mardi 4 juin 2013 Statut Membre Dernière intervention 6 février 2016 - 17 mars 2014 à 19:53
Bonjour,

J'ai un nombre de caractères qui peut arriver à 500 caractères, dont je dois les combiner entre eux, j'aurais en cas maximal, estimons que j'aurais 1 000 000 de string possibles.

C'est la quoi méthode pour stocker et optimiser les calculs, est-ce avec un Vector ou avec ArrayList? notons que la taille de ces String est dynamique ( avec 100 string , et en faire des combinaisons entre chaque 3 caractéres, j'ai eu une taille de 100000 de mon Vector, mais au delà de 100 string, Eclipse reste sans Bouger et je ne sais pas est-ce qu'il est entrain de faire les combinaisons ou il est planté, en tout cas il n'affiche pas un message d'erreur)

Comment je peux optimiser la mémoire sur Eclipse.
Est-ce que vous avez des informations sur les énumérations? Est ce bien utile de les utiliser pour le parcours des éléments de mon Vector?

All the Best,
Youness

2 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
17 mars 2014 à 07:49
"pour stocker et optimiser les calculs, est-ce avec un Vector ou avec ArrayList?"
Vector et ArrayList sont identiques à un "détail" près, c'est que Vector est thread-safe, or dans ton cas je doute que tu ais une application multi-thread, ce sera donc moins coûteux d'utiliser ArrayList.

"notons que la taille de ces String est dynamique"
Un String n'est jamais dynamique, à chaque modification c'est un nouvel objet qui est créé, c'est à dire recréation d'un tableau de caractères, copie du tableau, c'est extrêmement coûteux.
Pour des "String dynamiques" utilises StringBuilder (ou StringBuffer thread-safe)

Dans les deux cas (ArrayList et StringBuilder) il est plus que conseillé d'initialiser l'objet avec sa taille initiale dans le constructeur, par défaut le tableau de capacité sera de petite taille (10) et chaque redimensionnement coûtera lui aussi la création et la recopie d'un nouveau tableau donc autant partir directement avec la bonne taille.

Ceci dit, comme hier, as-tu vraiment besoin de stocker l'intégralité de tes données en mémoire ? Est-ce que tu ne peux pas en décharger tout ou partie en mémoire physique (fichier ou BDD) ?
0
neocol Messages postés 63 Date d'inscription mardi 4 juin 2013 Statut Membre Dernière intervention 6 février 2016 1
Modifié par neocol le 17/03/2014 à 14:37
Bonjour KX,


A chaque fois que je traite un élément du Vector (par exemple Vector.elementAt(0) = 1 2 3) je le stocke dans un Vector1 je le décompose en sous ensembles triés(stocke dans une Array list(résultat 1,2,3) mais je dois l'écrire de la même manière que 1 2 3 avec les espaces, du coup je crée une autre ArrayList1 (résultat 1 2, 2 3, 13) que je mets dans un Vector3 ensuite je compare chaque éléments avec Vector2 et après fini je fais Vector1.clear(), ArrayList.clear(); ArrayList1.clear();Vector2.clear();Vector3.clear() pour libérer la mémoire.

Franchement, j'ai pas su comment traiter directement le Vector.
Est-ce-possible de faire une comparaison avec les élément d'un ArrayList et d'un Vector ?

Ce que je dois faire, c'est prendre chaque élément du Vector de taille n, extraire toutes les combinaisons possibles de n-1 éléments, pour pouvoir les comparer avec un Vector2, si ne sont pas tous dans Vector2, alors je supprime l'élément de taille n du Vector, parceque je sais déjà que sa fréquence dans un fichier de transactions sera plus grande à un seuil définit par l'utilisateur.

Et moi je suis intéressé par les éléments qui sont non fréquents dans le fichier de transactions.

Je travaille sur l'algorithme Apriori si tu le connais mais d'une façon inverse, c-à-d je cherche les éléments non fréquents dans un fichier de transactions.

Dans un premier temps, je reçois un Vector de taille 1486553 d'une combinaison de 3 éléments, avec la comparaison avec Vector2,suppression des éléments que j'aurais pas besoin de faire le calcul de le fichier de transaction, et calcul de fréquence pour les éléments positifs enfin écriture dans le fichier output çà a duré 8559.921 seconds, le traitement s'est arrêté au niveau 3.

Les input : 100000 transactions, 300 éléments de taille1( 1,2,3 ..., 300), seuil : 75( si la fréquence d'un élément de le fichier de transactions dépasse 75%, on dit qu'il est fréquent sinon il est non fréquent), et moi je suis intéressé par les non-fréquents.

Dans l'étape 1 je calcule la fréquence de tous les éléments de taille 1(niveau 1),
si je trouve 1,2,3 non fréquents je passe à 1 2, 1 3, 2 3 (niveau 2)s'ils sont tous non fréquents je passe à 1 2 3(niveau 3), et ainsi de suite, jusqu'à la fin.

Bien Cordialement,
Youness
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
17 mars 2014 à 19:16
"A chaque fois que je traite un élément du Vector je le stocke dans un Vector1 je le décompose en sous ensembles triés (stocke dans une Array list(résultat 1,2,3) mais je dois l'écrire de la même manière que 1 2 3 avec les espaces, du coup je crée une autre ArrayList1 que je mets dans un Vector3 ensuite je compare chaque éléments avec Vector2"
J'ai rien compris.

"Est-ce-possible de faire une comparaison avec les élément d'un ArrayList et d'un Vector ? "
Déjà si tu mélanges les Vector et les ArrayList c'est que tu n'as pas compris quelle différence il pouvait y avoir entre les deux. Soit tu as un programme multi-threadé et tu n'utilises que des Vector (ou mieux, la méthode Collections.synchronizedList), soit tu as un programme monothread ce qui est ton cas, et tu n'utilises que des ArrayList. Mais on ne choisit pas l'une ou l'autre au hasard, quoi que tu fasses il faut qu'il y ait une raison derrière.

"Ce que je dois faire, c'est prendre chaque élément du Vector de taille n, extraire toutes les combinaisons possibles de n-1 éléments"
Ca c'est déjà fait dans ton autre discussion, Extraire tous les éléments possibles d'un ensemble, pas la peine de poser 15 questions sur le forum si c'est toujours le même problème... expose le clairement bien une fois, ça évitera de faire des petits bouts par ci par là qui ne vont finalement pas bien ensemble...

"Dans un premier temps, je reçois un Vector de taille 1486553 d'une combinaison de 3 éléments, avec la comparaison avec Vector2,suppression des éléments que j'aurais pas besoin de faire le calcul de le fichier de transaction, et calcul de fréquence pour les éléments positifs enfin écriture dans le fichier output"
Tu as visiblement un algorithme en largeur d'abord, c'est à dire que tu récoltes toutes les données avant de commencer les calculs, alors que tu pourrais avoir une approche en profondeur d'abord, et ainsi commencer les calculs dès que tu as suffisamment de données pour les traiter, ce qui permet de libérer de la mémoire avant de continuer les calculs.

"çà a duré 8559.921 seconds, le traitement s'est arrêté au niveau 3. "
Le mieux serait encore de voir ton code, parce que clairement là je ne sais pas de quoi tu parles.
0
neocol Messages postés 63 Date d'inscription mardi 4 juin 2013 Statut Membre Dernière intervention 6 février 2016 1
17 mars 2014 à 19:53
Merci pour ton retour. j'ai déjà suivi tes conseils. maintenant j'ai un programme complet.

ce que j'ai essaie de faire d'optimiser mon code.c'est vrai que je comprends pas grand chose en java, c'est la première que je travaille sur la programmation en général.

Merci encore pour ton aide.
All the Best,
Youness
0