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 :

Comment mapper un "gros" fichier en mémoire ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 27
    Par défaut Comment mapper un "gros" fichier en mémoire ?
    Bonjour à tous,

    Mon problème est le suivant:

    Je cherche à mapper un fichier en mémoire. Jusque là, pas de problème via les instructions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    size=GetFileSize(hFile, 0);
    hMap=CreateFileMapping(hFile, 0, PAGE_READONLY, 0, size, 0);
    ...
    lpMapView=MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, size);
    ...

    Dès lors, je peux facilement utiliser mon fichier avec mon pointeur lpMapView. Ma seule crainte était un test au limite avec un gros fichier (2Go) et ça a pas loupé : j'obtiens ERROR_NOT_ENOUGH_MEMORY!

    Je me doute qu'il est difficile d'obtenir un tel espace mémoire contigu mais je me demandais s'il n'y avais pas une configuration à faire (des instructions ou du projet) voir d'autres méthodes pour faire une opération équivalente (via la bibliothèque MFC pitetre.. )


    Contexte:
    Développement sous Visual C++ 2003
    Application avec MFC


    Merci d'avance!

  2. #2
    screetch
    Invité(e)
    Par défaut
    le probleme c'est surtout que tu viens d'exploser la plage adressable avec tes 2Go. ce code fonctionne sur les machines 64 bits (le memory map est géré par le systeme d'exploitation, donc il "umappera" automatiquement les parties dont tu ne te sers plus)

    la seule solution est de mapper petit bout par petit bout.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 27
    Par défaut
    Oki,
    c'est bien la solution que je voulais éviter mais bon, je vais segmenter en fonction de la taille du fichier...

    Des astuces particulières par rapport à un mappage de ce type ?

    Merci bien pour ta réponse en tout cas!

  4. #4
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Ton espace d'adressage "perso" est limite a 2Go sous Windows 32 bits. Tu peux monter a 3Go en bootant avec un switch special et en compilant ton exe avec un flag special... C'est pas vraiment fait pour ton cas

    La MSDN confirme ce que tu craignais:
    For files that are larger than the address space, you can only map a small portion of the file data at one time. When the first view is complete, you can unmap it and map a new view.
    http://msdn.microsoft.com/en-us/libr...61(VS.85).aspx

  5. #5
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 27
    Par défaut
    OKi merci !
    On va essayer de faire comme ça !

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

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