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 :

malloc pour des grandes tailles mémoires


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 77
    Points : 40
    Points
    40
    Par défaut malloc pour des grandes tailles mémoires
    Bonjour à tous,

    voila je suis confronté à un problème, dans mon code j'utilise un malloc qui me sert à mettre tous les octets d'un fichier pour passer le pointeur à une fonction.
    Le problème est que certain des fichiers peuvent atteindre plusieurs mégas, et là, le malloc me retourne un pointeur null.
    Alors ma question est, comment remplacer le malloc pour avoir un pointeur sur une zone mémoire de grande taille.
    Où il y a-t-il une option à mettre dans le makefile ? (pour info je suis sous Linux)

    Merci

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 77
    Points : 40
    Points
    40
    Par défaut
    oups, j'ai dit méga, je voulais dire giga. Désolé

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Par définition, si ton application est dite "32 bits", tu ne peux accéder au plus qu'à 4 giga octets d'adresses (on parle même pas de mémoire à ce stade).
    Le système se réserve 2 gigas d'adresses environ pour des pages partagées, les deux gigas restants pouvant être utilisés par malloc.

    Si tu excedes 2 gigas en un seul appel à malloc, la solution la plus simple AMHA consiste à compiler ton programme en 64 bits.

    Notes sur la gestion mémoire :
    malloc ne fait qu'allouer des adresses, pas de l'espace. L'allocation de l'espace se fait lorsque tu lis ou écrit à une adresse pour la première fois. De fait, tu es tout à fait autorisé à allouer 1 Go de mémoire même si ta machine ne possède que 128 Mo. La mémoire swap peut aider à combler le manque.

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Si ton fichier fait plusieurs Giga, il est presque impossible de faire un malloc pour allouer en mémoire vive un espace mémoire qui pourrait contenir entièrement ton fichier.

    malloc alloue un seul bloc en mémoire, c'est à dire qu'il faudrait que ton malloc trouve, en mémoire, un espace de plusieurs giga inoccupé.


    EDIT : je ne suis pas sûr que la mémoire swap puisse vraiment combler pour des tailles aussi grande.

    Sinon je que veux-tu faire exactement? Je pense que ton problème est surtout un problème de conception.

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 77
    Points : 40
    Points
    40
    Par défaut
    Merci pour vos réponses, vous confirmez ce que je pensais. Maintenant comment faire pour passer un pointeur ?

  6. #6
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    En passant, si ton but est simplement de charger un fichier énorme, tu peux utiliser mmap().
    Cette fonction mappe le contenu d'un fichier en mémoire, exactement comme s'il avait été chargé. En réalité ce n'est qu'une illusion, le système charge le contenu du fichier par pages au fur et à mesure que tu accèdes aux octets qui le composent.
    L'avantage énorme est la vitesse : charger ton fichier ne prend concrètement pas beaucoup plus de temps qu'un bête appel à malloc. Et l'algo de chargement des pages est beaucoup plus optimisé que celui que le commun des mortels pourrait coder.
    L'autre avantage est la simplicité : tu obtiens un pointeur sur le contenu de ton fichier.

  7. #7
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Citation Envoyé par Neckara Voir le message
    EDIT : je ne suis pas sûr que la mémoire swap puisse vraiment combler pour des tailles aussi grande.
    Non en effet, en 32 bits la mémoire swap ne peut certainement pas aider ton processus à accéder à plus que 2 gigas dans un seul bloc contigü, par définition.

  8. #8
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Citation Envoyé par phi1981 Voir le message
    Non en effet, en 32 bits la mémoire swap ne peut certainement pas aider ton processus à accéder à plus que 2 gigas dans un seul bloc contigü, par définition.
    C'est faux. Il est tout à fait possible d'allouer plus de 2 GB dans un processus 32 bits, et il est tout à fait possible qu'à un moment où à un autre tout ou partie de cette mémoire soit sur le swap.

  9. #9
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    C'est faux. Il est tout à fait possible d'allouer plus de 2 GB dans un processus 32 bits, et il est tout à fait possible qu'à un moment où à un autre tout ou partie de cette mémoire soit sur le swap.
    Au temps pour moi, je voulais dire 4 GB. Cependant, même 2 GB ça me parait énorme POUR UNE SEULE ALLOCATION, à cause de la division "adresses systèmes" / "adresses utilisateurs", mais je ne sais pas où elle est située.

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 13
    Dernier message: 22/04/2013, 18h25
  2. Réponses: 1
    Dernier message: 25/02/2012, 15h45
  3. Microsoft annonce une hausse de la limitation de taille mémoire des jeux pour le XBLA
    Par raptor70 dans le forum Développement 2D, 3D et Jeux
    Réponses: 3
    Dernier message: 05/10/2009, 10h57
  4. Réponses: 0
    Dernier message: 26/09/2009, 13h22
  5. Réponses: 5
    Dernier message: 18/05/2009, 16h32

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