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 :

Probléme étrange sur l'allocation mémoire


Sujet :

C++

  1. #1
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    923
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2011
    Messages : 923
    Par défaut Probléme étrange sur l'allocation mémoire
    Bonjour,

    Je suis sur un projet ,qui utilise beaucoup de pointer.
    Quand ma mémoire arrive à saturation , l'allocation échoue bien évidemment.
    Le hic , c'est quand je libère la mémoire , je vois pourtant bien dans le gestionnaire de tache que la mémoire utilisé diminue
    une allocation mémoire demandé de 700 Mb échoue avec l'exception "Out of memory" sachant qu'il reste environ 2Gb de mémoire disponible et que à ce moment là ,mon projet n'utilise que 500 Mb de mémoire.
    En passant par la méthode new et free , j'ai essayer la fonction VirtualAlloc pour les 700 Mb , même soucis.

    Comment résoudre ce problème ?

    Merci.

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 749
    Par défaut
    Ou là
    Chaque application se voit allouer une "portion de mémoire" par le système d'exploitation: donc ton ordinateur peut avoir 2, 4, 12, 24 Gigas en mémoire centrale, mais ton application maximum 1 ou 2 Gigas

    Dis-nous ton système d'exploitation et surtout s'il est 32 ou 64 bits?

    Édit: Un papier d'Intel de 2011 peut-être pas pertinent, mais qui montre le problème: Memory Limits for Applications on Windows

  3. #3
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Citation Envoyé par yann458 Voir le message
    En passant par la méthode new et free
    Mes yeux saignent... new et delete, ou bien malloc et free. Ne jamais mélanger les deux types d'allocation.

    ps: je sais, c'est un jamais d'informaticien...

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Et aussi, new[] et delete[]. Trop d'apprentis programmeurs ne connaissent même pas l'existence de delete[].
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2011
    Messages : 147
    Par défaut
    Bonjour,

    J'avais eu un probleme similaire il y a quelques temps avec un programme en developpement qui pouvait demander jusqu'a 10GO de memoire.
    Ma solution fut de compiler en 64bits.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Hello

    la première chose à faire dans ce genre de cas, c'est de passer un memory checker pour voir s'il y a des fuites, et où. Une fois les fuites corrigées (c'est vite dit mais c'est pas forcément facile au contraire !), à ce moment là seulement il faudra t'intéresser à d'autres stratégies pour économiser la mémoire.

  7. #7
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    hormis les problèmes de limite par applications cités précédemment, il faut aussi regarder comment ta ram est fragmentée...

    plus précisément si ton programme fait une grosse allocation de 700 Mo avec un seul malloc/realloc (façon C) ou new (façon C++), et si ma mémoire est bonne, le système dans ce cas cherchera un bloc de mémoire contiguë de 700 Mo. donc même s'il te reste 2 Go de ram, si la fragmentation de ta RAM fait qu'il n'y a pas de zone contiguë suffisamment grande pour recevoir ta demande d'allocation elle échouera.


    Ceci dit quand un programme consomme beaucoup de mémoire il faut regarder s'il n'y a pas de duplication de données inutile, et regarder les fuites éventuelle avec un programme comme valgrind par exemple.

  8. #8
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    Je suis le seul que ça choque une allocation de 700M?

    Normalement, une application bien pensée ne devrait pas avoir besoin d'allouer autant d'un coup. Qu'une application consomme 700M fragmenter en plein de petit morceau, je trouve ça normal, mais 700M d'un coup ........

    Peut-être faut-il voir pour changer ce fonctionnement, si c'est des ressource, on peut très bien passé par un file-mapping ou autre technique du genre pour allouer les 700M sur le disque et non pas en ram.

  9. #9
    Membre chevronné
    Profil pro
    Consultant en technologies
    Inscrit en
    Octobre 2013
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies

    Informations forums :
    Inscription : Octobre 2013
    Messages : 158
    Par défaut
    Une allocation de 700 MB ca ne me choque pas plus que ça,
    ça correspond à un peu plus qu'un tableau de 512x512x512 entiers

    Bien sur ça peut souvent se cacher sur disque, mais
    Les lectures/écritures sur disques sont plus lente qu'en RAM, donc ça réduit l’intérêt d'avoir une machine rapide et un algo optimisé. Surtout que la RAM c'est pas cher
    Certaines opérations peuvent demander d’accéder à des cases non voisines du tableau ce qui multiplierait pas autant le temps de lecture sur disque
    Pourquoi emmerder avec un système de cache pour quelques chose qui prend quelques pour-cents de la RAM totale

    évidemment sur un système embarqué avec peu de ram et un disque SSD c'est différend
    évidemment si il ne faut faire qu'une opération sur le tableau ça ne sert à rien de l'avoir en entier en mémoire.
    Mais si il faut par exemple le transformer en ondelette, filtrer l'information à une certaine échelle puis revenir dans l'espace direct, Cacher les données sur disque ne servira qu'à perdre du temps

  10. #10
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    hormis les problèmes de limite par applications cités précédemment, il faut aussi regarder comment ta ram est fragmentée...

    plus précisément si ton programme fait une grosse allocation de 700 Mo avec un seul malloc/realloc (façon C) ou new (façon C++), et si ma mémoire est bonne, le système dans ce cas cherchera un bloc de mémoire contiguë de 700 Mo. donc même s'il te reste 2 Go de ram, si la fragmentation de ta RAM fait qu'il n'y a pas de zone contiguë suffisamment grande pour recevoir ta demande d'allocation elle échouera.


    Ceci dit quand un programme consomme beaucoup de mémoire il faut regarder s'il n'y a pas de duplication de données inutile, et regarder les fuites éventuelle avec un programme comme valgrind par exemple.
    La fragmentation de la ram c'est des c****ries ...
    A moins que tu travailles sur un système vieux de vingt ans, les applications tournent dans un environnement virtuel dans lequel la ram "telle que vue par le programme" est contiguë.
    Tu peux très bien allouer 700Mo de mémoire vive, totalement fragmentée, et pourtant avoir un bloc contigu de 700Mo de ram (vu par le programme).
    http://en.wikipedia.org/wiki/Memory_management_unit

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Mais ici, le problème est justement dans l'espace mémoire plutôt que la RAM.
    2GO, c'est la quantité d'espace mémoire disponible à un processus user-mode sous un Windows 32 bits (hormis mode 3GO + /LargeAddressAware).

    Et l'espace mémoire lui, souffre de la fragmentation.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Salut

    Comme le dis Médinoc, la virtualisation de la mémoire ne veux pas dire qu'elle n'est pas fragmenté, ça veux dire qu'elle fait croire au programme que le bloc 0,1,2,3...X est contigüe.

    Si tu utilises beaucoup de pointeur, le mieux est de réservé un bloc de sizeof(X) pointeur et de placement new dessus. Tu peux allez encore plus loin en allouant un énorme bloc (1-2Go, voir plus su 64bits), et les fragmenté tout même en plus petit bloc indépendant qui ont chacun leur utilité. Comme ça, tu alloues un fois et utilise X fois, si tu fais de nombreux new/delete c'est très rentable.

  13. #13
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Par défaut
    Bonjour,

    Pour une taille pareil tu peux, peu être te tourner vers mmap, augementer la taille de ram que ton programme va utiliser.

    Après j'ai fais des programmes plutôt gourmand en RAM a cause d’enchaînement d’état en tout genre et la je me suis orienté sur des tableaux de masques binaires.

    Il est important de bien penser à ta structure de données.

    Vu la taille que tu alloue d'un coup je pense plus à un fichier.
    t'est-il neccessaire d'avoir tout le fichier en mémoire, si c'est le cas alors utilise mmap qui est fait pour ça.

    Bonne journée

  14. #14
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Par défaut
    Citation Envoyé par jouana Voir le message
    Pour une taille pareil tu peux, peu être te tourner vers mmap, augementer la taille de ram que ton programme va utiliser.
    Il a utilisé VirtualAlloc(), donc c'est un environnement Windows, mmap() n'existe pas.

  15. #15
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Mais son équivalent existe.

    Ce qui n'avance pas à grand-chose si le problème est la consommation d'espace d'adressage et non de RAM. Dans tous les cas, cette méthode implique de ne pas mémoriser/mapper tout le fichier d'un coup (et donc, de faire plus ou moins son propre paging).

    Edit: Ou bien, passer en 64 bits.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Problème d'allocation mémoire sur requête Oracle.
    Par peaceinpal dans le forum JDBC
    Réponses: 2
    Dernier message: 02/08/2011, 09h41
  2. Précision sur pre-allocation mémoire et sum([C{1,:}])
    Par 20905313t dans le forum MATLAB
    Réponses: 2
    Dernier message: 10/02/2011, 12h01
  3. Réponses: 17
    Dernier message: 27/03/2009, 17h09
  4. [Tableaux] probléme étrange sur un array
    Par boadog dans le forum Langage
    Réponses: 2
    Dernier message: 28/11/2007, 10h43
  5. [xp] problème étrange sur le système de fichiers
    Par Huntress dans le forum Windows XP
    Réponses: 4
    Dernier message: 05/03/2006, 20h15

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