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 :

Fonction malloc: allocation mémoire depuis le disque dur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Par défaut Fonction malloc: allocation mémoire depuis le disque dur
    Bonjour,

    A votre avis est-ce possible de faire une sorte de fonction malloc qui m'allouerait des blocs de mémoire dans un fichier sur mon disque dur?
    Il faudrait que je remplace ce bout de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    template <class T>
    //...
    void* p = malloc( n * sizeof(T) );
       if( p == NULL )
          throw std::bad_alloc();
    return (T*)p;
    Je renvoie un pointeur de type void* que je caste en T* (l'appel au constructeur de la classe T est fait dans une autre fonction, ici il s'agit juste d'allouer la mémoire). Je vois mal comment renvoyer un pointeur de type void* depuis un fichier!?
    Quelqu'un pourrait-il m'expliquer, svp?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Tu veux dire, un File Mapping ?
    Rien de standard : C'est de la programmation système, avec CreateFileMapping() sous Windows, mmap() sous unixoïde.
    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.

  3. #3
    Membre éclairé Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Par défaut
    Oui mais lorsque je fais du filemapping, je dois mappé des parties (blocs) de fichiers en mémoire. Je dois gérer beaucoup de mémoire. Est-ce que je ne vais pas être limitée à la taille de la heap? Parce que j'ai déjà essayé avec ::HeapAlloc mais sans susscès:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     assert( mHeap != NULL );
            DWORD nBytes = n * sizeof(T);
     
    		std::cout << "allocate " << nBytes << " bytes\n";
     
            VOID* p = ::HeapAlloc( mHeap, 0, nBytes );
            if( p == NULL )
                throw std::bad_alloc();
            return pointer(p);
    Je suis limité à 198Mo d'allocation maximum (1Go de Ram sur le portable).

    Ce que je souhaiterais faire:
    - allouer des blocs de mémoire depuis un disque dur
    - pouvoir les unmapper lorsque j'ai besoin d'en mapper d'autres
    mais lorsque j'utilise un pointeur qui a été déréférencé être capable de remapper le bloc de fichier en mémoire.
    J'ai déjà commencé à écrire une classe pointeur pour cela mais elle est templatée ce qui pose problème quand je l'utilise dans les containers de la STL (c'est pour un allocateur de mémoire STL). Il peste car il n'aime pas que les pointeurs que je lui renvoie soit templatée, ce qui est logique...

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    J'ignore si les File Mappings sont limités ou non à la taille du Heap. Pour moi, c'est comme VirtualAlloc() : Ça ne devrait pas être vraiment limité...
    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 éclairé Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Par défaut
    Je viens d'essayer et ça l'est... En fonction du nombre de programmes que j'ai lancé en même temps que ma "simulation", j'ai un une exception générée lors d'une de mes allocations vers 58Mo à 192Mo...
    Note: HeapAlloc, utilise VirtualAlloc quand il alloue d'importants morceaux de mémoire...

    Sinon j'ai trouvé AWE mais il faut une machine surpuissantes ... style 16Go de RAM et en plus un processeur 64 bits

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Ces autres applications sont-elles donc assez nombreuses pour bouffer le restant du giga de RAM ?
    Car en théorie, VirtualAlloc() n'est limité que par la mémoire virtuelle disponible.

    Donc, si d'autres programment bouffent 800Mo + La taille du fichier de pagination, il est normal que VirtualAlloc() échoue...

    Au début, je croyais que tu parlais d'un programme tournant tout seul sur la machine...
    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. Créer une VM depuis un disque dur ?
    Par boufon dans le forum VMware
    Réponses: 2
    Dernier message: 30/06/2011, 20h38
  2. Temps total de lecture de fichiers depuis le disque dur
    Par Tesing dans le forum Composants
    Réponses: 1
    Dernier message: 05/12/2009, 20h14
  3. Réponses: 0
    Dernier message: 19/01/2009, 21h10
  4. Pointeur sur fonction et allocation mémoire
    Par Captain_JS dans le forum C++
    Réponses: 4
    Dernier message: 31/07/2008, 09h55
  5. Lire swf depuis le disque dur, cache: possible ?
    Par c13303 dans le forum Flash
    Réponses: 2
    Dernier message: 18/11/2006, 18h45

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