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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre habitu�
    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
    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
    27 136
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 136
    Billets dans le blog
    150
    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 confirm�

    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
    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....

  4. #4
    Membre habitu�
    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
    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
    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
    Membre habitu�
    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
    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