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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 ++;
                        }

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