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

Java Discussion :

Solution miracle anti-doublon


Sujet :

Java

  1. #1
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut Solution miracle anti-doublon
    Bonjour,

    Alors que j'explique un peu mon appli... Je parse un fichier XML pour pouvoir insérer en base de donnée les paramètres présent dans les balises. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <balise mere>
    	<balise fille [attributs]>
    		parametres
    	</balise fille>
    </balise mere>
    Bon, le parsing du fichier se passe très bien. Ensuite, ce qu'il faut savoir, c'est que je travaille sur des fichiers assez volumineux (de l'ordre de 500 000 lignes ). J'utilise SAX pour parser le fichier (normal).
    Donc, mon soucis serait de vérifier la présence de doublon dans les paramètres à insérer en base... Sans faire de SELECT, et sans utiliser trop de mémoire
    C'est pour ça que je mets "solution miracle".
    Pour l'instant, ma méthode consiste à partir du postulat que les balises devraient être ordonnées et donc j'utilise un Set que je ré-initialise quand je change de groupe de balises. Puisque j'utilise un Set, il n'y a pas de doublon à l'ajout. Donc, je regarde si le groupe de paramètres a été ajouté ou pas.

    J'espère avoir été clair. Sinon, n'hésitez pas à demander des précisions.

    Voilà, je suis réceptif à vos idées/conseils/propositions/canard laqué...
    ++
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  2. #2
    Membre actif Avatar de Seb19
    Homme Profil pro
    Concepteur SOA
    Inscrit en
    Septembre 2005
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Concepteur SOA

    Informations forums :
    Inscription : Septembre 2005
    Messages : 217
    Points : 292
    Points
    292
    Par défaut
    Citation Envoyé par Gueritarish Voir le message
    Donc, mon soucis serait de vérifier la présence de doublon dans les paramètres à insérer en base... Sans faire de SELECT, et sans utiliser trop de mémoire
    Bonjour, et pourquoi ne pas mettre une contrainte d'unicité sur les paramètres au niveau de la base de données. Il te suffiera ensuite de gérer le code retour du double insert.
    Celui qui pose une question risque cinq minutes d'avoir l'air bête.
    Celui qui ne pose pas de question restera bête toute sa vie.(proverbe chinois)

  3. #3
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Citation Envoyé par Seb19 Voir le message
    Bonjour, et pourquoi ne pas mettre une contrainte d'unicité sur les paramètres au niveau de la base de données. Il te suffiera ensuite de gérer le code retour du double insert.
    Le problème c'est que je n'ai pas le droit de toucher à l'architecture des tables dans la base de donnée...
    Pas de questions technique par MP, les forums sont là pour ça.

  4. #4
    Membre actif Avatar de Seb19
    Homme Profil pro
    Concepteur SOA
    Inscrit en
    Septembre 2005
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Concepteur SOA

    Informations forums :
    Inscription : Septembre 2005
    Messages : 217
    Points : 292
    Points
    292
    Par défaut
    Dans ce cas, tu pourrais peut être utiliser une Hashtable dans laquelle tu stockerais tes données avant l'insertion en base, avec les méthodes containsValue et containsKey pour éviter les doublons.
    Celui qui pose une question risque cinq minutes d'avoir l'air bête.
    Celui qui ne pose pas de question restera bête toute sa vie.(proverbe chinois)

  5. #5
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Citation Envoyé par Seb19 Voir le message
    Dans ce cas, tu pourrais peut être utiliser une Hashtable dans laquelle tu stockerais tes données avant l'insertion en base, avec les méthodes containsValue et containsKey pour éviter les doublons.
    En fait, c'est ce que je faisais, mais je me retrouve avec un OutOfMemoryError à la 15 000ème requêtes d'ajout de balise du même "groupe" en base ...
    C'est pour ça que j'étais passé par les Set... Mais bon, ça marche pas non plus.

    En tout cas, merci de tes réponses ^^

    ++
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  6. #6
    Membre chevronné

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Points : 1 954
    Points
    1 954
    Par défaut
    Tu devrais utiliser un set, dans lequel tu stockes non pas la valeur mais l'empreinte (hash) de cette valeur. Ce qui te fera gagner de la mémoire.

    Reste à gérer les faux positifs lors d'une collision. Là, à moins de recourir à un select...

  7. #7
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    En fait, je suis pas sur que ta solution puisse marcher... Puisque je mets les paramètres récupérés dans une HashMap qui est du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {mere.fille.attribut = att; mere.fille.fille_nest = parametres}
    dans l'exemple suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <balise mere>
    	<balise fille [attributs]>
    		<balise fille_nest>parametres</balise fille_nest>
    	</balise fille>
    </balise mere>
    Donc, même si les paramètres sont les mêmes, les Map seront différentes, et auront une empreinte différentes..

    Voilà, ++
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  8. #8
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Points : 996
    Points
    996
    Par défaut
    Tu utilises quel type de bdd ?

    une solution pourrait être l'utilisation de table sql temporaire libre à toi de mettre la clé sur la contrainte d'unicité voulu et c'est transparent en bdd (tout au moins sur oracle).

  9. #9
    Membre chevronné

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Points : 1 954
    Points
    1 954
    Par défaut
    J'en viens à converger vers le même type de solution. Si le stockage mémoire est impossible, alors recourir a un mécanisme de persistance on disk.

  10. #10
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Points : 996
    Points
    996
    Par défaut
    on peut même aller plus loin en utilisant un procedure sql stocké et la c'est le serveur de bdd qui bosse en plus.

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Comme suggéré plus haut: tu tiens un Set qui ne contient que des Hash de chaque fille (à toi de coder la fonction de hash correctement pour qu'elle soit indépendant de la mère). Tu peux ainsi associer à chaque row un entier de 64bits (long). Ca te fait normalement 18446744073709551616 possibilité. Si tu as 500.000 entrées, les probabilités d'une fausse collision sont de 1 sur 3.16E13, soit très faibles (calcul à la louche!). L'occupation mémoire serait, si on imagine que les donnée de gestion dans le hashset sont d'une centaine d'octet par entrées, plus ou moins 50M. En cas de match dans le set, il te faudra inévitablement controller la db pour voir si il ne s'agit pas d'un faux positif.

  12. #12
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Le truc c'est que je peux vraiment pas touché à la base de donnée.. Rien de rien. Je peux insérer dans champs dans certaines tables, et c'est tout...
    D'où mon penchant pour une solution "miracle" qui n'utiliserait pas trop de mémoire, pas de code sur la base de donnée...mais qui m'empêcherait d'essayer d'insérer des doublons...

    Bon, ça tient du vodoo et de la magie noire, mais sans arriver au sacrifice humain, je le sais bien
    Mais bon, il me faudrait trouver une solution...

    Pour l'instant, c'est une solution pas très élégante que j'ai "trouvé"... Je fais l'INSERT quand même et j'ai une SQLException : violate primary key constraint (un truc dans ce goût là...)
    Et donc, l'ajout ne se fait pas
    Mais c'est pas du tout élégant

    Voilà, ++
    Gueritarish qui fait la dance anti-doublon-de-la-pluie
    Pas de questions technique par MP, les forums sont là pour ça.

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Gueritarish Voir le message
    Pour l'instant, c'est une solution pas très élégante que j'ai "trouvé"... Je fais l'INSERT quand même et j'ai une SQLException : violate primary key constraint (un truc dans ce goût là...)
    Et donc, l'ajout ne se fait pas
    Mais c'est pas du tout élégant
    Et en quoi c'est pas élégant, çà a été suggéré plus haut par Seb19, de mettre une contrainte d'unicité. Tu as dit que c'était pas possible. Mais si elle est déjà la sur ta table, ton problème ne se pose pas, ton gestionnaire de DB s'occupe des contraintes, comme un grand, c'est sont boulot. Toi tu catche l'erreur et tu passe au suivant :/

    Tu te rends compte qu'on est là occupé de te proposer des solutions en supposant qu'il n'y a pas de contrainte d'unicité formelle dans le schéma (oubli du designer ou que sais-je) et que tu ne peux pas en rajouter, donc que tu dois checker faire toi même le boulot que ferais la DB?? Alors que finalement non seulement le problème n'existe pas, mais en plus on t'avais servir la solution de base la plus standard et tu a dit que 'était 'impossible' ??

    Bref donc, ton problème n'existe pas

  14. #14
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Euh... au temps pour moi

    Désolé tout le monde.
    Je pensais à quelque chose de plus "propre", mais effectivement, je dois dire que j'ai pas trop réfléchi à cette solution là. Je dois avouer que je suis pas trop expert DB
    Encore une fois mea culpa.

    Et merci à tout le monde pour m'avoir proposé des solutions...

    ++
    Gueritarish qui s'excuse encore une fois
    Pas de questions technique par MP, les forums sont là pour ça.

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

Discussions similaires

  1. [AJAX] Boucle for in anti doublons
    Par laurentg2003 dans le forum AJAX
    Réponses: 9
    Dernier message: 20/02/2010, 15h04
  2. Réponses: 1
    Dernier message: 12/03/2009, 10h41
  3. Méthode anti doublons - logique de programmation / langage SQL ?
    Par polothentik dans le forum Langage SQL
    Réponses: 6
    Dernier message: 16/04/2008, 10h53
  4. Réponses: 18
    Dernier message: 27/08/2007, 16h11
  5. Anti doublons MySQL
    Par FoX_McClouD dans le forum Outils
    Réponses: 4
    Dernier message: 30/04/2006, 23h56

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