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 d'allocation mémoire > 2Go


Sujet :

C++

  1. #1
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut Problème d'allocation mémoire > 2Go
    Salut,

    J'ai besoin de charger en mémoire (allocation dynamique d'objets) un gros paquet de données. Au total la taille mémoire requise pour tous les objets doit dépasser le 2Go et apparemment c'est ça qui provoque le plantage de mon programme. Je voudrais savoir s'il existe un moyen de dépasser cette limite (option de compilation ou autre).
    Je suis sous windows avec visual C++ au cas ou ça aurait de l'importance.

    Merci

  2. #2
    Membre Expert
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Par défaut
    2 GO dans la RAM... Mais ça va pas???
    Si ton ordi a moins de 2 GO,tu vois un peu le problème....

  3. #3
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    supersnail >> disons que si son programme doit tourner sur des machines avec 16 Go de RAM, 2 GO n'est plus grand chose. Par contre, sur une machine courrante, boom .
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Ca dépense déjà de la version de windows que tu utilises... Est-ce bien un windows 64 bits ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    supersnail >> disons que si son programme doit tourner sur des machines avec 16 Go de RAM, 2 GO n'est plus grand chose. Par contre, sur une machine courrante, boom .
    Oui effectivement je suppose qu'on a la RAM qui va avec et éventuellement un peu de swap. Le jee ne pense pas que mon "boom" est lié à un manque de mémoire, mais plutôt à une incapacité de gérer un espace d'adressage > 2Go.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Suivant les versions de Windows 32 bits, on peut augmenter l'espace virtuel adressable de 2 a 3GB avec l'option /3GB dans boot.ini et utiliser plus de mémoire physique que 4GB en utilisant PAE.

    Je suis quand même assez surpris que vous deviez charger plus de 2GB d'objets en mémoire. Si vous n'avez pas le choix, il serait peut être préférable d'utiliser un système 64 bits... Mais est-ce vraiement raisonnable?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre Expert
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Par défaut
    Pourquoi pas fragmenter ton bloc et charger les données au fur et à meusre?

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Citation Envoyé par supersnail Voir le message
    Pourquoi pas fragmenter ton bloc et charger les données au fur et à meusre?
    Dans le meilleur des cas, il pourrait mettre ses objets dans une vraie base de données (donc sur disque) et n'utiliser la mémoire que pour les objets 'actifs'.

    Je ne sais pas si un language objet sait faire cela de façon transparente (ie, ne va-t-il pas falloir faire "à la main" sa propre gestion mémoire.

    -W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    C'est nul Windows ou quoi ? Sous Linux 4Go de RAM en 32 bits par processus ça ne pose aucun problème.

  10. #10
    Membre chevronné Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Par défaut
    http://msdn.microsoft.com/en-us/libr...1z(VS.71).aspx

    Citation Envoyé par loufoque Voir le message
    C'est nul Windows ou quoi ? Sous Linux 4Go de RAM en 32 bits par processus ça ne pose aucun problème.

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Citation Envoyé par loufoque Voir le message
    C'est nul Windows ou quoi ? Sous Linux 4Go de RAM en 32 bits par processus ça ne pose aucun problème.
    Par défaut Linux 32 bits permet à un process utilisateur d'adresser 3GiB et au système le GB restant. Windows est en 2GiB/2GiB.

    Si on veut pouvoir utiliser jusqu'à 64GiB de RAM il faut aussi mettre en route l'option PAE.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par loufoque Voir le message
    C'est nul Windows ou quoi ? Sous Linux 4Go de RAM en 32 bits par processus ça ne pose aucun problème.
    Faux. Seulement sur les noyaux d'entreprises. Sur les noyaux classiques, la limite est entre 2 et 2.5Go.

  13. #13
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    On s'est mal compris. Le noyau peut accéder à une certaine quantité de RAM. Sur x86 32 bits sans PAE on est effectivement limité à 3Go.
    Ça n'a rien à voir avec l'espace que peut adresser un processus en espace utilisateur.

  14. #14
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Citation Envoyé par loufoque Voir le message
    On s'est mal compris. Le noyau peut accéder à une certaine quantité de RAM. Sur x86 32 bits sans PAE on est effectivement limité à 3Go.
    Ça n'a rien à voir avec l'espace que peut adresser un processus en espace utilisateur.
    3GiB est la taille maximale de l'espace d'adressage utilisateur
    Il n'est pas nécessaire qu'il y ait 3GiB de RAM pour faire malloc (3GiB).
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  15. #15
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    On peut adresser 4Go dans un processus 32bits. Ensuite, le processeur lui est en 36bits, et grâce à la MMU l'OS peut adresser bien plus s'il est conçu pour. A ce moment, chaque processus pourrait adresser 4Go différents.
    En revanche, dans un processus Linux classique, on ne dépasse pas les 2.5Go alloués/allouables dans le processus. Sous Windows, c'est 3Go allouables au maximum (et donc en adressable, on dépasse bien si on compte le système accessible depuis un processus).

  16. #16
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    On peut adresser 4Go dans un processus 32bits. Ensuite, le processeur lui est en 36bits, et grâce à la MMU l'OS peut adresser bien plus s'il est conçu pour. A ce moment, chaque processus pourrait adresser 4Go différents.
    En revanche, dans un processus Linux classique, on ne dépasse pas les 2.5Go alloués/allouables dans le processus. Sous Windows, c'est 3Go allouables au maximum (et donc en adressable, on dépasse bien si on compte le système accessible depuis un processus).
    Yup, j'ai précisé "utilisateur" dans mon post précédent.
    Néanmoins, par défaut Windows 32 bits. l'espace utilisateur max est de 2Go si on ne le démarre pas /3GO.
    Pour Linux, les versions "récentes" sont 3Go/1Go.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  17. #17
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut
    Merci de votre aide,

    Je n'ai pas résolu mon problème, mais j'ai opté pour un contournement qui consiste à indexer le fichier qui contient les données et à l'interroger à la demande. Evidemment ça prend beaucoup plus de temps que si les données sont en mémoire...mais ça marche. Au passage je me suis bien pris la tête concernant la limite de 2Go cette fois pour l'adressage de la lecture du fichier... Je n'ai pas trouvé de solution avec les fonctions standard (getline seekg tellg) donc obligé de passer au fonctions système (SetFilePointer ReadFile)

  18. #18
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut Et passer par une base de données?
    En général, elles offrent des possibilités de "cache" qui devraient permettre d'optimiser les entrées sorties.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  19. #19
    Membre averti

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 44
    Par défaut
    Les 2 Gb représentent l'espace adressable. Elle ne dépend pas de la quantité de mémoire vive. Si vous avez des barrettes de 32 Gb, ça n'y changera rien. La limite se trouve au niveau du système d'exploitation.

    Sur Windows, par défaut c'est du 2 Gb. On peut augmenter cette limite et la faire passer à 3Gb en allant modifiant le fichier boot.ini. Il faut aussi compiler les exécutables qui devront dépasser ces 2 Gb avec l'option /LARGEADDRESSAWARE.
    Cette limite de 3 Gb peut être dépassée sur certains systèmes Windows (les versions Server il me semble).

    Sous Linux, la limite est supérieure à 2 Gb mais je me souviens plus quelle est cette limite exactement.

  20. #20
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par tnarol Voir le message
    Je n'ai pas résolu mon problème, mais j'ai opté pour un contournement qui consiste à indexer le fichier qui contient les données et à l'interroger à la demande.
    C'est effectivement la bonne solution....

    Evidemment ça prend beaucoup plus de temps que si les données sont en mémoire...mais ça marche.
    Ca c'est pas normal... ca ne devrait pas, à moins que tu doives ré-utiliser sans arrêt les données précédemment lues. Mais en général ce n'est jamais le cas, sauf pour un petit ensemble de données (que tu vas donc conserver en mémoire pour le coup).

    Au passage je me suis bien pris la tête concernant la limite de 2Go cette fois pour l'adressage de la lecture du fichier... Je n'ai pas trouvé de solution avec les fonctions standard (getline seekg tellg) donc obligé de passer au fonctions système (SetFilePointer ReadFile)
    Aïe.... mauvaise pioche... Oublies les fichiers *sequentiels* (à la ReadFile/SetFilePointer)... Si tu veux aller vite, avec un accès aléatoire à un gros fichier, va regarder les CreateFileMapping....

    C'est un peu la méthode inverse:
    mapping = CreateMapping(monfichier);
    while () {
    memoire = MapViewFile(mapping,index,taille) // taille doit etre un multiple de secteurs du disque
    utilisation directe de "memoire"...
    }

Discussions similaires

  1. Problème d'allocation mémoire
    Par Fibus dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 10/01/2008, 16h35
  2. Problème d'allocation mémoire
    Par elmayor1983 dans le forum C++
    Réponses: 5
    Dernier message: 14/02/2007, 10h08
  3. Problème d'allocation mémoire et fork
    Par Conap dans le forum Langage
    Réponses: 3
    Dernier message: 20/07/2006, 15h34
  4. Problème d'allocation mémoire
    Par araya dans le forum C
    Réponses: 2
    Dernier message: 04/05/2006, 20h03
  5. Problème d'allocation mémoire
    Par cali1983 dans le forum C++
    Réponses: 10
    Dernier message: 10/03/2006, 23h23

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