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

C# Discussion :

[Hashtable][OutOfMemoryException] Une solution ?


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 102
    Par défaut [Hashtable][OutOfMemoryException] Une solution ?
    Bonjour à tous,

    Voilà je teste un systeme de distribution de numéros de série.
    Pour ce faire je lance un soft sur plusieurs PCs qui ma récupérer des numéros de série sur le PC utilisé et qui va les stocker dans des fichiers de logs pour traitement ulterieur.

    En effet, il s'agit de traiter tous ces fichiers créés sur differents PC et d'analyser leur contenu pour s'assurer de l'unicité des numéros.

    Les numéros extraits des fichiers de logs sont stockés dans une hashtable (pour une recherche plus efficace).

    Le probleme c'est que lorsque j'arrive à un taille de hashtable conséquente (100 000 entrées environ) j'ai une exception outofmemory lorsque je veux ajouter une entrée dans la hashtable.

    Y a-t-il un moyen de contourner cette limite de taille de la hashtable ?

    Sachant que j'ai plus de 3 Go de ram et qu'au max j'en utilise 2.03(winxp y compris ) avec le soft lorsque j'ai le message d'exception.

    Je pensais que la limite en taille d'une hashtable est fixé par la place dispo en RAM.

    Vous avez des idées ?

  2. #2
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Bonjour,

    De quel type sont les objets stockés dan ta hashtable ?

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 102
    Par défaut
    Des chaines de caractères
    KEY : string de 17 caractères
    Value : chemin vers le fichier analysé + 20 caractères


    Je vois l'idée. Mettre dans la hashtable des données moins gourmandes en mémoire genre

    KEY (entier) | Value (entier )

    ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Xploit Voir le message
    Des chaines de caractères
    KEY : string de 17 caractères
    Value : chemin vers le fichier analysé + 20 caractères


    Je vois l'idée. Mettre dans la hashtable des données moins gourmandes en mémoire genre

    KEY (entier) | Value (entier )

    ?
    100000 entrées comme ça, c'est pas monstrueux... si on considère que le chemin fait 100 caractères, ça fait 100000 * (17 + 100 + 20), soit environ 13Mo (plus l'overhead de la hashtable, mais ça fait pas une grosse différence. Donc y a pas de quoi causer une OutOfMemoryException, le problème doit venir d'ailleurs...

    Y a-t-il un moyen de contourner cette limite de taille de la hashtable ?
    La hashtable n'a pas de limite de taille (ou alors s'il y en a une ça doit être Int32.MaxValue, autant dire que tu as de la marge.)

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Poster un bout de code serait une bonne idée.

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 102
    Par défaut
    Alors en fait je fais une petite précision :

    Ma hashtable possede 10 367 102 entrées lorsque que l'ajout d'une entrée me sort en outofmemory exception...

    Si je reprends le calcul donné par tomlev ça me ferait du 1.4Go ?! Oo

    Voici le code qui traite les fichiers

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
     
    //membre de la classe
    private Hashtable m_allSN;
                try
                {
                    m_allSN = new Hashtable();
     
                    for (int i = 0; i < m_allFiles.Count; i++)  // Treatment for each File given by the user
                    {
                        string line;
                        int line_number =  0;
                        string[] separator = { ";" };
     
                        m_sr = new StreamReader((String)m_allFiles[i]);
     
                        while ((line = m_sr.ReadLine()) != null)    // Reads lines from file til EOF
                        {                    
     
                            //Serials treatment
                            if (m_allSN.ContainsKey(line.Split(separator, StringSplitOptions.None)[0]))
                            {
     
                                m_duplicateSerials.Add(line.Split(separator, StringSplitOptions.None)[0]+ 
                                                    "\t" + m_allFiles[i] + 
                                                    " at line " + line_number);
                                m_pass = false;
                                //throw new Exception("Serial Number " + line.Split(separator, StringSplitOptions.None)[0] +
                                //                    " already exists in the file " + m_allFiles[i] + 
                                //                    " at line " + line_number);
                            }
                            else m_allSN.Add(line.Split(separator, StringSplitOptions.None)[0], m_allFiles[i]);
                            line_number ++;
                        }

  7. #7
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Xploit Voir le message
    Alors en fait je fais une petite précision :

    Ma hashtable possede 10 367 102 entrées lorsque que l'ajout d'une entrée me sort en outofmemory exception...
    Là, ça fait un 0 de plus ....

    Si je reprends le calcul donné par tomlev ça me ferait du 1.4Go ?! Oo
    Et avec XP en 32 bits tu es limité à 2 Go addressable + 1 en cache. Ceci explique cela.

    Il faut revoir le concept....

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Là, ça fait un 0 de plus ....
    Deux en fait, il parlait de 100 000 entrées au début...

    Donc oui, effectivement ce n'est pas étonnant que ça pète... c'est vraiment nécessaire de charger toutes ces données en mémoire en même temps ?

  9. #9
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 102
    Par défaut
    Et bien ma petite appli consiste à vérifier l'unicité des serials numbers.
    Donc il faut pouvoir comparer le numéro traité avec tous les précédents...donc je dirais qu'i il me faut toutes les infos (tous les numéros de série déjà récupéré dans les fichiers de logs) au même moment en mémoire.

    Après je pourrais créer une fusion de tous les fichiers de logs en un seul fichier qui contiendrait tous les numéros puis faire le traitement dessus mais c'est pas du tout satisfaisant.

  10. #10
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Xploit Voir le message
    Et bien ma petite appli consiste à vérifier l'unicité des serials numbers.


    Ce serait quand même plus simple de balancer le tout dans une table de base de données et de faire une requête en unicité, non ? (dans la mesure où intercepter via une violation de clef dupliquée n'est pas forcément l'idéal ici, si on veut tout garder).

    D'où viennent-ils ces fichiers de log ?

  11. #11
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 102
    Par défaut
    Tout mettre dans une table de BDD ça serait refaire le chemin inverse de mon processus de distribution de numéro de série. Mais l'idée peut etre interessante.

    Sinon les fichiers de logs proviennent d'une application qui récupère des numéros de série sur un serveur mysql et qui les enregistre dans un fichier .txt de log.
    Le tout est justement de valider l'unicité des numeros générés.

  12. #12
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Xploit Voir le message
    Sinon les fichiers de logs proviennent d'une application qui récupère des numéros de série sur un serveur mysql et qui les enregistre dans un fichier .txt de log.
    Le tout est justement de valider l'unicité des numeros générés.
    Mais dans ce cas pourquoi ne pas requêter la base existante pour vérifier l'unicité ?

    Ou alors il y aurait plusieurs bases ?

  13. #13
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 102
    Par défaut
    l'idée me semble bonne, le problème est que mes numéros de série sont générés à partir d'un seul enregistrement dont un champ est incrémenté à chaque fois qu'on récupère la valeur du champs pour l'attribution d'un numéro de série.
    Donc dans ce cas là, je n'ai pas un enregistrement par numéro de série attribué et donc demander à la base l'unicité des numéros générés n'est pas possible, si j'ai bien compris.

  14. #14
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Xploit Voir le message
    l'idée me semble bonne, le problème est que mes numéros de série sont générés à partir d'un seul enregistrement dont un champ est incrémenté à chaque fois qu'on récupère la valeur du champs pour l'attribution d'un numéro de série.
    Donc dans ce cas là, je n'ai pas un enregistrement par numéro de série attribué et donc demander à la base l'unicité des numéros générés n'est pas possible, si j'ai bien compris.
    Si j'ai bien compris, ce que tu viens d'écrire est antinomique avec ce que tu as écrits au dessus où tu laissez entendre que tes numéros étaient dans une base.

    Dans tous les cas de figure, il y a quelque chose que je ne comprends pas : si tes numéros sont délivrés via une sequence de la base, comment pourraient ils être dupliqués ?

  15. #15
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 102
    Par défaut
    Dans ma table gerant les numéros de série, j'ai un enregistrement (ligne ) pour chaque clé (VendorID, ServiceID) ayant un champ numéro d'allocation.

    En sachant que le client doit d'abord faire un SELECT... FOR UPDATE puis un update de la valeur d'allocation.

    Le souci était d'être certain que si plusieurs clients attaquent en meme temps la table, ils ne puissent lire la même valeur de numéro d'allocation.

    En faisant un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Start transaction
    SELECT...FOR UPDATE
    UPDATE ...
    Commit
    Je pense que la table est bien lockée par le client qui fait la transaction et les autres sont en attente.

    J'aurais juste aimé pouvoir le démontrer...

    Je ne sais pas si c très clair mais je fais de mon mieux pour expliquer le but des applis dont je parle.

  16. #16
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Xploit Voir le message
    Dans ma table gerant les numéros de série, j'ai un enregistrement (ligne ) pour chaque clé (VendorID, ServiceID) ayant un champ numéro d'allocation.

    En sachant que le client doit d'abord faire un SELECT... FOR UPDATE puis un update de la valeur d'allocation.

    Le souci était d'être certain que si plusieurs clients attaquent en meme temps la table, ils ne puisse lire la même valeur de numéro d'allocation.
    Drôle d'idée !
    Je ne connais pas MySql mais j'ai quand même du mal à imaginer que ce soit tellement pauvre fonctionnellement qu'il n'y ait pas de notion de séquence.

  17. #17
    Membre Expert
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Par défaut
    Dans MySql je ne crois pas qu'il y ait de sequence mais il y a des champs autoincrement de souvenir

  18. #18
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 102
    Par défaut
    La notion de séquence dont tu parles serait comparable à ce que j'utilise ... une TRANSACTION ?

    je ne suis pas expert non plus en SQL...

    En tout cas la transaction verrouille la table

  19. #19
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par jbrasselet Voir le message
    Dans MySql je ne crois pas qu'il y ait de sequence mais il y a des champs autoincrement de souvenir
    Oui, je disais "séquence" mais c'est ce que je voulais exprimer comme concept fonctionnel.

  20. #20
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 102
    Par défaut
    Citation Envoyé par jbrasselet Voir le message
    Dans MySql je ne crois pas qu'il y ait de sequence mais il y a des champs autoincrement de souvenir
    L'autoincrément, si je ne me trompe pas, est utilisé pour auto incrémenter un champ de la table lorsque l'on fait un nouvel enregistrement.

    OR dans mon cas il s'agit de faire une mise à jour d'un champ d'un enregistrement existant...

Discussions similaires

  1. gestion des utilisateurs dans une solution 3-tiers
    Par nadia lydia dans le forum Oracle
    Réponses: 3
    Dernier message: 26/10/2005, 12h58
  2. cherche de l'aide pour une solution
    Par ouam81 dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 31/05/2005, 08h57
  3. XML / Xpath -> une solution avec Builder?
    Par say dans le forum C++Builder
    Réponses: 3
    Dernier message: 12/05/2005, 11h56
  4. Réponses: 2
    Dernier message: 25/04/2005, 09h55
  5. Mise en place d'une solution Data Guard 9i R2
    Par user_oracle dans le forum Oracle
    Réponses: 4
    Dernier message: 16/02/2005, 10h12

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