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 :

Queue contient trop de données.


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Apprenti développeur
    Inscrit en
    Février 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti développeur

    Informations forums :
    Inscription : Février 2014
    Messages : 102
    Points : 58
    Points
    58
    Par défaut Queue contient trop de données.
    Bonjour,

    J'ai un bout de code qui contient une Queue<Tuple<IPort, List<IPort>>>().

    Au bout d'un certain temps, je me retrouve avec 2 millions d'items, ce qui sature la RAM.

    Y aurait-il une possible optimisation ? Merci


    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
     
                var m_Stacks = new Queue<Tuple<IPort, List<IPort>>>();
                m_Stacks.Enqueue(new Tuple<IPort, List<IPort>>(starting, new List<IPort>()));
     
     
                while (m_Stacks.Count > 0)
                {
                    var args = m_Stacks.Dequeue();
                    var cursor = args.Item1;
                    var path = args.Item2;
     
                     if (dropIfAbsorbing && cursor.absorbing)
                    {
                        _cntAbs = _cntAbs + 1;
                        continue;
                    }
     
     
     
                    path.Add(cursor);
     
                    if (cursor.fum_activating || cursor.activating)
                    {
                        //combined = string.Join("^", path.Select(i=>i.owner.name.ToString()));
                        combined = string.Join("^", path.Select(i => i.ToString()));
                        if (!list_visit.Contains(combined))
                        {
                            list_visit.Add(combined);
                            yield return path;
                        }
                    }
     
     
     
     
                    foreach (var topPort in topPorts(cursor))
                    {
                        m_Stacks.Enqueue(
                            new Tuple<IPort, List<IPort>>(
                                topPort,
                                new List<IPort>(path)
                            )
                        );
                    }

  2. #2
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    Comment se fait-il que tu cumules 2 millions d'items sans jamais les vider ?

    Sinon la première idée qui me vient c'est de ne pas tout garder en mémoire mais "dumper" une partie des items sur le disque, soit dans un fichier, soit dans une base de données.

  3. #3
    Membre du Club
    Homme Profil pro
    Apprenti développeur
    Inscrit en
    Février 2014
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti développeur

    Informations forums :
    Inscription : Février 2014
    Messages : 102
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par Noxen Voir le message
    Comment se fait-il que tu cumules 2 millions d'items sans jamais les vider ?

    Sinon la première idée qui me vient c'est de ne pas tout garder en mémoire mais "dumper" une partie des items sur le disque, soit dans un fichier, soit dans une base de données.
    C'est une longue histoire haha. Disons que je dois parcourir des blocs, et ces ensembles de blocs forment des chemins et les possibilités de combinaisons pour ces chemins sont conséquentes.

    Le code fonctionne bien, mais c'est juste niveau performance ou ça foire.

    J'avais pensé à Sérialiser et à mettre le contenu de l'objet dans une base de donnée. Ensuite je mime le comportement de la Queue en faisant des accès à cette base, en désérialisant, en supprimant le premier item dans la base etc..

    Mais le probleme, c'est que dans le Tuple à l'intérieur de la queue j'ai une List<IPort>. Cette liste peut atteindre 90 items.

    Ca ne risque pas de poser probleme d'avoir 90 items multiplé par 2,000,000 ? le fichier risque d'être gros.

    Tu en penses quoi ?

    En tout cas merci pour l'aide

Discussions similaires

  1. Réponses: 0
    Dernier message: 26/05/2008, 11h20
  2. [XSLT] Trop de données suite à muench
    Par nagdrir dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 03/09/2007, 12h28
  3. Réponses: 2
    Dernier message: 24/04/2007, 16h56
  4. export excel trop de données à envoyer
    Par laurent.w dans le forum Access
    Réponses: 9
    Dernier message: 06/02/2007, 21h22
  5. [SQL SERVER] Table contient trop d'enregistrements ?
    Par Tankian dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 10/08/2004, 10h40

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