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 :

Probleme mémoire: écriture gros fichier


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    COO
    Inscrit en
    Juillet 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : COO

    Informations forums :
    Inscription : Juillet 2008
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Probleme mémoire: écriture gros fichier
    Bonjour,

    Je dois écrire un flux de données dans un fichier qui au final sera de plusieurs giga.

    Mon problème est qu'à mesure que j'écris dans mon fichier les données qui arrive, j'ai la ram qui augmente jusqu'à saturation et quand je quitte mon programme la mémoire vive n'est pas libéré sauf si je relance ma lecture en écrasant le fichier, dans ce cas la mémoire est libérée et à nouveau gonflée à mesure de l'écriture du fichier.

    J'ai regardé un peu du côté du mapping mais je dois avoué que je suis un peu perdu.

    Voici mon code:

    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
     
    #include <iostream>
    #include <fstream>
    #include <vector>
     
    int main()
    {
       typedef unsigned char uint8;
       typedef vector<uint8>::size_type v_size_type;
       v_size_type const buf_size = 512000;
       vector<uint8> buf(buf_size);
       long i;
       ofstream SaveFile("my_file", ios::app | ios::trunc | ios::binary);
       if(!SaveFile){
           throw "erreur ouverture/creation fichier ecriture";
       }
       for (i=0;i<FLUX;i+=LARGEUR){
           //Remplissage du buffer
           LectureFlux(i,1000,reinterpret_cast<uint8*>(&buf[0]);
     
           //Ecriture du buffer
           SaveFile.write(reinterpret_cast<char const*>(&buf[0]), buf.size()*sizeof(buf[0]));
           SaveFile.flush();
       }
     
       SaveFile.close();
     
       return 0;
    }
    J'ai essayé d'ouvrire / fermer le fichier pour chaque itération mais ça ne change rien, la mémoire continu à gonfler...

    Merci pour votre aide.

    Mario

    PS: je suis sous linux

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Je ne vois rien dans le code qui me choc ( enfin j'ai fait qu'un parcours rapide ) mais le problème est ( surement ):

    Tant que on peut lire le flux
    - Lecteur du flux ( allocation de la mémoire pour placer les elements lu )
    - Ecriture fichier
    - Libération de la mémoire des elements lu ( bah oui, il sont dans le fichier :p )

    Je parirai qu'il manque la partie en rouge.
    (Ça s'apelle une fuite de mémoire)
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Moi je parie que la lecture dans un vector fait un add des élements à la fin....
    donc il faut vider le vector.

    apres, honettement, je trouve un peu overkill d'utiliser un vector ici !
    Mais bon....
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  4. #4
    Futur Membre du Club
    Profil pro
    COO
    Inscrit en
    Juillet 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : COO

    Informations forums :
    Inscription : Juillet 2008
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Merci pour vos réponses.

    - Libération de la mémoire des elements lu ( bah oui, il sont dans le fichier :p )
    Comment je peux faire?

    J'ai aussi testé sans utiliser de vector et le problème est le même. Je pense que le problème vient du write parce que si je le mets en commentaire (comme ci-dessous) la mémoire et stable et rien n'est consommé. Cela dit quand je laisse le write, ce n'est pas la mémoir de mon soft qui explose mais la mémoire système... Comme si le système gardais quelque part toute ce qui est écrit sans jamais le vider. Y a t'il un moyen de dire au système de ne pas garder tout ça en mémoir et de tout libéré une fois écrit dans le fichier. Je pensais que c'était le rôle du flush mais apparemment ça ne suffit pas.

    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
     
    #include <iostream>
    #include <fstream>
    #include <vector>
     
    int main()
    {
       int const buf_size = 512000;
       static uint8 buf[buf_size];
       long i;
       ofstream SaveFile("my_file", ios::app | ios::trunc | ios::binary);
       if(!SaveFile){
           throw "erreur ouverture/creation fichier ecriture";
       }
       for (i=0;i<FLUX;i+=LARGEUR){
           //Remplissage du buffer
           LectureFlux(i,1000,buf);
     
           //Ecriture du buffer
           //Plus de problème de mémoir... mais plus de fichier non plus :-(
           //SaveFile.write((char *) buf, sizeof buf);
           //SaveFile.flush();
       }
     
       SaveFile.close();
     
       return 0;
    }

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Je pense sans en être certain que le système garde tout simplement en mémoire les éléments du fichier au cas où tu redemandes une lecture de celui-ci. J'aurais tendance à dire que cette mémoire va être relâchée au fur et à mesure que les processus vont demander de la mémoire supplémentaire et que l'OS aura besoin de récupérer ces pages. Cela pénalise-ton système ?

  6. #6
    Futur Membre du Club
    Profil pro
    COO
    Inscrit en
    Juillet 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : COO

    Informations forums :
    Inscription : Juillet 2008
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Salut,
    Je pense sans en être certain que le système garde tout simplement en mémoire les éléments du fichier au cas où tu redemandes une lecture de celui-ci. J'aurais tendance à dire que cette mémoire va être relâchée au fur et à mesure que les processus vont demander de la mémoire supplémentaire et que l'OS aura besoin de récupérer ces pages. Cela pénalise-ton système ?
    Salut Archi, merci pour ta réponse.
    Oui je pense aussi que ça vient de là.
    Comme je vais devoir faire de la compression sur mon flux de données, je m'étais dis que ça pourrais poser problème pour la suite. Enfin je vais continuer et si vraiment ça pose problème, je reviendrais ;-)

Discussions similaires

  1. Probleme mémoire fonction comparaison fichier
    Par l4r3nZu dans le forum Général Java
    Réponses: 7
    Dernier message: 01/03/2010, 16h54
  2. [PHP 5.2] probleme post de gros fichier xml
    Par djynwk dans le forum Langage
    Réponses: 3
    Dernier message: 03/02/2010, 11h33
  3. TFileStream : probleme de seek sur très gros fichiers
    Par simoryl dans le forum Composants VCL
    Réponses: 6
    Dernier message: 21/08/2007, 14h00
  4. Réponses: 6
    Dernier message: 12/12/2006, 16h13
  5. Probleme transfert gros fichier avec webdav
    Par cybernetique dans le forum Apache
    Réponses: 1
    Dernier message: 10/05/2006, 09h53

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