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 :

Question allocation mémoire MAX avec malloc


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut Question allocation mémoire MAX avec malloc
    Hello,

    J'aurais besoin de mettre en mémoire un fichier de log pour le parser.
    En l’occurrence, il pèse 226MB et quand je tente de mettre le contenu de mon fichier dans un string, l'allocation échoue.

    Pour comprendre un peu plus et trouver la valeur max, j'ai crée une boucle qui me fait des malloc successifs en incrémentant de 1 MB par 1MB, de 0 jusqu'à 100MB pour voir jusqu'où je peux aller et il semblerait que le max que je puisse allouer est 62MB.

    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
     
            char *p = NULL;
            int i = 0;
            int total_i = 0;
            for ( i = 0 ; i<100 ; i++ )
            {
                if ( allocate_1D_c( i*1024*1024 ) )
                {
                    total_i+=i;
                    printf("\n%d MB\nTotal MB %d", i, total_i);
                    free(p),p=NULL;
                }
                else
                {
                    printf("\nFAILED %d MB",i);
                }
            }
            system("pause");
    Dans mon fichier de log, le résultat est le suivant :
    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
     
    allocate.h::allocate_1D_c -> Not enough space, 63.000000
    allocate.h::allocate_1D_c -> Not enough space, 64.000000
    allocate.h::allocate_1D_c -> Not enough space, 65.000000
    allocate.h::allocate_1D_c -> Not enough space, 66.000000
    allocate.h::allocate_1D_c -> Not enough space, 67.000000
    allocate.h::allocate_1D_c -> Not enough space, 68.000000
    allocate.h::allocate_1D_c -> Not enough space, 69.000000
    allocate.h::allocate_1D_c -> Not enough space, 70.000000
    allocate.h::allocate_1D_c -> Not enough space, 71.000000
    allocate.h::allocate_1D_c -> Not enough space, 72.000000
    allocate.h::allocate_1D_c -> Not enough space, 73.000000
    allocate.h::allocate_1D_c -> Not enough space, 74.000000
    allocate.h::allocate_1D_c -> Not enough space, 75.000000
    allocate.h::allocate_1D_c -> Not enough space, 76.000000
    allocate.h::allocate_1D_c -> Not enough space, 77.000000
    allocate.h::allocate_1D_c -> Not enough space, 78.000000
    allocate.h::allocate_1D_c -> Not enough space, 79.000000
    allocate.h::allocate_1D_c -> Not enough space, 80.000000
    allocate.h::allocate_1D_c -> Not enough space, 81.000000
    allocate.h::allocate_1D_c -> Not enough space, 82.000000
    allocate.h::allocate_1D_c -> Not enough space, 83.000000
    allocate.h::allocate_1D_c -> Not enough space, 84.000000
    allocate.h::allocate_1D_c -> Not enough space, 85.000000
    allocate.h::allocate_1D_c -> Not enough space, 86.000000
    allocate.h::allocate_1D_c -> Not enough space, 87.000000
    allocate.h::allocate_1D_c -> Not enough space, 88.000000
    allocate.h::allocate_1D_c -> Not enough space, 89.000000
    allocate.h::allocate_1D_c -> Not enough space, 90.000000
    allocate.h::allocate_1D_c -> Not enough space, 91.000000
    allocate.h::allocate_1D_c -> Not enough space, 92.000000
    allocate.h::allocate_1D_c -> Not enough space, 93.000000
    allocate.h::allocate_1D_c -> Not enough space, 94.000000
    allocate.h::allocate_1D_c -> Not enough space, 95.000000
    allocate.h::allocate_1D_c -> Not enough space, 96.000000
    allocate.h::allocate_1D_c -> Not enough space, 97.000000
    allocate.h::allocate_1D_c -> Not enough space, 98.000000
    allocate.h::allocate_1D_c -> Not enough space, 99.000000
    Sachant que je dispose de 16Go de RAM dont 6Go en cours d'utilisation à l'instant soit à priori 10Go de libre. (Win10)
    En regardant le gestionnaire des tâches, je constate que la mémoire allouée se cumule au file de la boucle. C'est pour ça que j'ai ajouté dans la boucle une variable pour compter le cumul de la mémoire allouée ( réussi 62 ), ce qui donne 1953MB. Et le processus correspondant à l’exécution du programme fait 1958MB à la fin. Cela correspond moins la mémoire système pour l'invite de commande qui doit prendre 5MB je suppose.
    Je ne comprends pas pourquoi la mémoire n'est pas libérée en instantanée comme demandée dans la boucle mais seulement à la fin.

    La question finale est comment puis-je contourner le fait que je ne puisse allouer que 62MB max via un malloc ? ( si c'est faisable ) .

    Merci d'avance pour vos luminaires.

    Cordialement.

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    malloc() peut allouer l'ensemble de la mémoire physique accessible à une application (limité à 2G ou 3G sur une application 32bits.)
    Ton code ne libère jamais la mémoire, il y a bien 2G d'alloué en tout.

  3. #3
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    LOL... corrigé pour la libération. Fallait aller dormir.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (p=allocate_1D_c( i*1024*1024 ))
    J'arrive cependant toujours pas à allouer les 250Mb dans le code pour parser -.-

  4. #4
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    A priori, c'est ma structure 2D soit un tableau à 2 dimensions de i lignes et de 1024 colonnes qui nécessite 2.5GB de mémoire pour être allouée.
    L’échec se situe là compte tenu de ta remarque précédente.

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Pour avoir 2.5G accessible, il te faut donc compiler en mode 64bits

  6. #6
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    Je n'ai pas besoin d'autant même s'il serait intéressant que je me penche sur la question.
    Je n'ai pas anticipé la taille de la structure, le fichier de log fait 3 millions de lignes et je reservais 1ko pour les colonnes.
    Je fais une passe avant pour déterminer le nombre de colonnes max et en réalité je n'ai besoin que de 300 octets.
    Je divise pas 3 la taille nécessaire. L'idéal étant que je crée une structure qui alloue par ligne la taille nécessaire par chacune d'elle.
    Il faudrait que je reprenne pas mal de choses pour cela. A voir pour la prochaine fois.
    Merci pour vos réponses jusqu'à la prochaine galère ^^

Discussions similaires

  1. Question Allocation Mémoire Conditionnelle
    Par JasBeckC dans le forum Débuter
    Réponses: 12
    Dernier message: 27/10/2014, 20h56
  2. Allocation mémoire : tableau vs malloc
    Par scorbo dans le forum Débuter
    Réponses: 4
    Dernier message: 15/06/2007, 12h47
  3. Réponses: 4
    Dernier message: 20/11/2006, 01h02
  4. Pb d'allocation dynamique avec malloc
    Par Magicmax dans le forum C
    Réponses: 5
    Dernier message: 12/12/2005, 01h04
  5. Pb d'allocation mémoire malloc
    Par oz80 dans le forum C++
    Réponses: 5
    Dernier message: 18/11/2005, 17h23

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