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 :

mon prog c++ n'utilise pas le swap


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Par défaut mon prog c++ n'utilise pas le swap
    Salut!
    Je débute en c++ et j'ai le problème suivant:
    je veux exécuter un prog qui crée une matrice de "double" de dimension 20000 x 20000:

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <iostream>
    using namespace std;
     
    int main(){
      cout<<"size of double: "<< sizeof(double)<<endl;
      double** Matrix=new double*[20000];
      for (int i=0; i<20000; i++) Matrix[i]=new double[20000];
    }


    Quand je lance le prog, j'obtiens la sortie suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    size of double: 8
    terminate called after throwing an instance of 'std::bad_alloc'
      what():  St9bad_alloc
    Aborting

    Si je tape la commande linux "free -s 0.01" pendant l'exécution du prog, je remarque que la mémoire physique diminue pratiquement jusque zéro puis que le prog s'arrête. Je ne comprends pas pourquoi il ne continue pas à tourner en utilisant les 18 GB de mon swap (oui, je sais, c'est beaucoup)...
    Quelqu'un a une idée??

    (je suis sous debian et je compile avec g++)


    sortie de "free -s 0.01":

    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
                 total       used       free     shared    buffers     cached
    Mem:        516692     437852      78840          0      40244     190016
    -/+ buffers/cache:     207592     309100
    Swap:     17757076        112   17756964
     
                 total       used       free     shared    buffers     cached
    Mem:        516692     445044      71648          0      40244     190016
    -/+ buffers/cache:     214784     301908
    Swap:     17757076        112   17756964
     
                 total       used       free     shared    buffers     cached
    Mem:        516692     455088      61604          0      40244     190016
    -/+ buffers/cache:     224828     291864
    Swap:     17757076        112   17756964
     
                 total       used       free     shared    buffers     cached
    Mem:        516692     467364      49328          0      40244     190016
    -/+ buffers/cache:     237104     279588
    Swap:     17757076        112   17756964
     
                 total       used       free     shared    buffers     cached
    Mem:        516692     476788      39904          0      40244     190016
    -/+ buffers/cache:     246528     270164
    Swap:     17757076        112   17756964
     
                 total       used       free     shared    buffers     cached
    Mem:        516692     489064      27628          0      40244     190016
    -/+ buffers/cache:     258804     257888
    Swap:     17757076        112   17756964
     
                 total       used       free     shared    buffers     cached
    Mem:        516692     499604      17088          0      40244     190016
    -/+ buffers/cache:     269344     247348
    Swap:     17757076        112   17756964
     
                 total       used       free     shared    buffers     cached
    Mem:        516692     510564       6128          0      40240     188996
    -/+ buffers/cache:     281328     235364
    Swap:     17757076        112   17756964
     
    CRASH!

  2. #2
    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
    Attention, c'est un programme 32bits, non ? Donc son espace adressable est de 4Go maximum, et sous Linux c'est limité à 2Go par processus. Même si c'est juste juste au niveau de la mémoire, si tu as d'autres objets volumineux, ça plantera sans aucun doute.

  3. #3
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Ce n'est pas possible d'allouer un peu moins de mémoire pour ton problème ?

    D'allouer 20000 double, et de réutiliser cet espace 20000 fois ?

    car 8*20000*20000 = 2.98 Go de mémoire.... c'est pas mal, un peu trop

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    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 394
    Par défaut
    J'ai bien peur que ce soit la seule solution:

    20,000 * 20,000 : 400,000,000 de doubles.
    Un double faisant 4 ou 8 octets, on se retrouve déjà avec 1.6 Go dans le premier cas, 3.2 Go dans le second cas (enfin, avec de "petits" Go) ---> Sur une machine 32bits, le second cas a déjà épuisé la mémoire disponible pour un processus.
    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
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    AMHA, une matrice carrée de 20.000 doubles, ca fait effectivement énrome&hellip; Est tu sur d'avoir besoin d'une matrice si grande?

    D'un autre coté, n'oublie quand meme pas qu'une matrice, au niveau de la mémoire, ca garde toujours une seule dimention.

    Rien ne t'empeche d'utiliser la formule classique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    position[ligne][colone]=position[ligne*nombre_colone+colone]
    ou ses dérivées, principalement, afin de t'éviter d'avoir à jouer systématiquement avec des pointeur de pointeurs...

    Juste par aquit de conscience: quelle application pourrait nécessiter de disposer en permanence de 400.000.000 (car, il s'agit bien de cela) d'éléments, et en type double, qui plus est???
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    mat.M
    Invité(e)
    Par défaut
    for (int i=0; i<20000; i++) Matrix[i]=new double[20000];
    Et la gestion d'exceptions elle est ou ?
    Si c'était géré par un try..catch on serait plus fixés...
    Pour des grosses allocations il faut passer par d'autres méthodes que new , utiliser des fonctions spécifiques à Linux pour la gestion de mémoire.

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Et si tu créais un fichier de 20000*20000*8 octets qui ferait office de swap ?

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Par défaut
    Merci à tous pour vos réponses! Sur les autres forums, on me répond que des conneries...
    Je ne savais pas que j'étais limité à 2GB de mémoire par prog...
    Il ne me reste plus qu'à implémenter un système efficace d'adressage sur 64 bits, pour mon proco 32 bits, et à modifier un peu mon noyau

    En fait, dans mon vrai programme, je dois inverser une matrice d'entiers 20.000 x 20.000 (un truc de malade). Comme elle est symétrique, je ne stocke que sa partie triangulaire supérieure dans mon array 20.000 x 20.000, et je profite de la place dans la partie triangulaire inférieure pour y stocker la décomposition de Choleski (matrice également triangulaire, mais contenant des double). Comme j'ai besoin de ma matrice initiale pour calculer sa décomposition de Choleski, je suis obligé de les avoir toutes les deux en mémoire simultanément.


    Bon, si je comprends bien, les solutions sont:
    - exécuter mon prog sur un machine >32bits
    - utiliser un fichier sur le disque, plutot qu'un array de arrays en mémoire
    - rendre carrées mes deux matrices triangulaires (chipotage d'indices) et les stocker dans 2 matrices séparées (une d'entiers, et une de double)


    Vous inquiétez pas pour le temps d'exécution, c'est un prog que je fais pour mon mémoire, c'est pas un prog que j'utiliserai tous les jours, donc c'est pas grave s'il lui faut 1 semaine pour tourner.

    Encore merci, et si vous avez d'autres idées, ne vous gênez pas...

  9. #9
    tut
    tut est déconnecté
    Membre éclairé
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Par défaut
    Citation Envoyé par keket123
    Encore merci, et si vous avez d'autres idées, ne vous gênez pas...
    Oui :
    appeler Meteo France, je crois que c'est eux qui ont le plus gros ordinateur de France...

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Par défaut
    arf, c'est maintenant que je regrette d'être belge!
    Vu la taille du pays, meteo belgique se contente sûrement d'un bon vieux C64

  11. #11
    Membre éclairé
    Inscrit en
    Août 2005
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 89
    Par défaut
    Ce n'est pas 3 Go par processus (en espace utilisateur, en fait 4 Go - 1 Go réservé pour le noyau) ? Avec une possibilité de réduire l'espace du noyau en recompilant afin d'atteindre environ 3.5 Go ?

    par exemple ici http://kerneltrap.org/node/2450
    ils expliquent l'inverse, c'est à dire augmenter l'espace pour le noyau.

    ?

  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
    C'est en-dessous des 3Go, plutôt vers les 2.5, j'ai une fois vu le platage en tant réel avec un top.
    Sous Windows sans modif, c'est 2Go, avec un switch au démarrage, c'est 3Go.

Discussions similaires

  1. Postgresql n'utilise pas mon index GIN pour le fulltext
    Par kedare dans le forum Requêtes
    Réponses: 3
    Dernier message: 27/03/2009, 01h24
  2. Mon prog ne marche pas avec Cygwin
    Par AlKoLiK dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 12/06/2007, 01h29
  3. Réponses: 1
    Dernier message: 10/04/2007, 22h27
  4. Réponses: 2
    Dernier message: 06/06/2005, 15h13

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