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 :

problem lors de l'ecriture d'un fichier


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 35
    Points : 8
    Points
    8
    Par défaut [résolu]problem lors de l'ecriture d'un fichier
    Bonjour a tous,
    j'ai un petit probleme lors de l'ecriture d'un fichier. Je crée un fichier a l'aide de différents calcul, et ce fichier est assez gros 800Mo, je suis sous linux, et j'ecris ce fichier petit a petit.

    C'est a dire que g une boucle qui contient un fwrite ca ecrit a chaque fois 8 octets, mais la n'est pas le probleme, lors de l'ecriture de ce fichier, je peux voir sa taille sur le disque augmenter, mais ce que j'apprécie pas c que l'ordinateur le garde egalement dans un buffer, que je n'arrive pas a vider (g essayé fflush(fout) le fout c le fout=fopen...), et du coup je vois ma ressource en memoire vive diminuée,diminuée, et ensuite il pagine, grrrr, j'y suis depuis un bon bout de temps et je ne sais pas comment faire.

    Si quelqu'un a deja rencontré ce probleme, et qu'il l'ait deja resolu ou seulement quelqu'un qui connait le moyen d'éviter cela, je le remercie d'avance de repondre a ce message.

    Toute suggestion sera la bienvenue

    merci a tous

  2. #2
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    Quelques essais à faire chronologiquement!!!

    1 essaie de remplacer fflush() par fsync(). Théoriquement ca devrait faire la même chose, mais....

    2 vérifie que le démon kdflush tourne. C'est lui qui assure la synchronisation quand tu fais fsync()

    3 supprime les buffers liés au flux: force l'écriture à chaque fois. setvbuf() permet de le faire.

    Mais tout ca ne joue qu'au niveau des flux de ton processus et pas des caches du système.

  3. #3
    fd
    fd est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 162
    Points
    162
    Par défaut
    sinon utilise les fonctions non bufférisées : open, write etc...

  4. #4
    Rédactrice
    Avatar de xave
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2002
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2002
    Messages : 871
    Points : 1 094
    Points
    1 094
    Par défaut
    Euh... ouais, moi j'essaierai bien la même chose que fd...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 35
    Points : 8
    Points
    8
    Par défaut
    merci je vais essayer tout ca

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 35
    Points : 8
    Points
    8
    Par défaut
    g essayé open et write mais ca n'a rien changé et le pire, c qu'ensuite il ne me libere pas la memoire allouée !!!

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 16
    Points : 17
    Points
    17
    Par défaut
    Ton problème je pense est dû au mécanisme de mémoire cache que le noyau possède pour limiter les accès au disque.
    Car en effet lorsque tu balance fflush() rien te garantit que tout écrit sur le disque car il se peut (trés probablement) que le noyau décide de mettre tes données dans sa mémoire cache en attendant qu'il décide de le vider pour une raison ou pour une autre.
    C'est pour cela que le seul moyen de pouvoir et ou de faire comme l'a dit
    joellel de remplacer fflush() par fsync() ce qui forcera le noyau à écrire "physiquement" tes données (voir man fsync).
    Ou d'appeler directement sync() qui lui va forcer l'écriture physique de toutes les données qui ont eu une nouvelle modification d'écriture.
    De plus ce qui est puissant c'est que sync() reste bloqué tant que toutes les données n'ont pas été transmise au disque.
    Voilà ce que j'en pense maintenant essaye et regarde.
    Une dernière chose si tu veux utiliser avec read() et write() il faut que tu ouvre ton descripteur avec l'option O_SYNC.
    @++.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 35
    Points : 8
    Points
    8
    Par défaut
    merci pour cette explication.
    Ca commence à devenir plus clair

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 35
    Points : 8
    Points
    8
    Par défaut
    G tout essayé mais rien ne marche.
    g essayé open, write et l'option O_SYNC ca marche pas
    g essayé fopen,fwrite,et fsync ca ne marche pas

    quand je tedis que ca ne marche pas je veux dire que les données sont bien ecrites sur le disque dur mais qu'elles sont toujours en mémoire vive, et ca ca ne me plait pas

    si quelq'un a une autre idée !!!

  10. #10
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par gemai
    quand je tedis que ca ne marche pas je veux dire que les données sont bien ecrites sur le disque dur mais qu'elles sont toujours en mémoire vive, et ca ca ne me plait pas
    Si les donnees sont bien ecrites sur le disque dur quel est le probleme ?

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 35
    Points : 8
    Points
    8
    Par défaut
    le probleme est que le programme a utilisé la memoire vive pour ecrire le fichier et qu'il ne la libere pas meme apres la fin du programme, et je ne vois pas pourquoi il aurait besoin de la memoire vive pour ecrire le fichier

    de plus quand j'ai un fichier de 800 Mo à ecrire que j'ecris par petit bouts, il me met les 800Mo en meoire vive, et comme je n'ai que 500 Mo il pagine le reste.

    Et c cet effet la que je ne voudrais plus avoir

  12. #12
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Le buffer fichier est normalement limite en taille (lorsque la taille est atteinte l'ecriture a lieu, si ce n'etait pas fait).

    Es tu vraiment certain que c'est le buffer systeme qui prends de la place et non un buffer de ton application ?

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 35
    Points : 8
    Points
    8
    Par défaut
    franchement je ne sais pas, je n'ai aucune idée de quel buffer il s'agit et pourquoi au fur et a mesure que mon fichier s'écrit la taille de ma mémoire vive utilisée augmente. Je vois ca a partir du moniteur systeme de ma redhat. peut etre que c lui qui dit n'importe quoi...

    Comment je peux savoir de quel buffer il s'agit?

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 35
    Points : 8
    Points
    8
    Par défaut
    que puis je faire si il s'agit du buffer de mon appli?

  15. #15
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par gemai
    que puis je faire si il s'agit du buffer de mon appli?
    Ben si c'est un buffer que ton application alloue, tu peux le liberer quand tu n'en as pas besoin

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 35
    Points : 8
    Points
    8
    Par défaut
    comment je peux faire ca?
    (je sais je ne suis pas trés doué )

  17. #17
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Est ce que dans ton application tu as des malloc, des calloc, des new ou des strdup ?

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 35
    Points : 8
    Points
    8
    Par défaut
    g des malloc et des calloc mais je fais des free pour eux
    ce dont je suis sur c que si la taille memoire utilisée augmente, cela vient du fait que je fais des fwrite. Voila un exemple de 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
    int main()
    {
      int *i,j;
      FILE *fic;
     
    i = (int *) malloc(sizeof(int) *2097152);
     
     
    fic=fopen("/home/vignal/aaaaaa.bin","wb");
    for (j=0;j<100;j++)
    	fwrite(i,sizeof(int),2097152,fic);
    	fclose(fic);
    free(i);
    }
    ce code devrais allouer 8 Mo de memoire vive et c tout alors que quand je regarde mo moniteur systeme des qu'il s'amuse a faire les fwrite la memoire vive utilisée augmente jusqu'a atteindre le totalité de ma memoire vive

  19. #19
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Bon si rien que ce code pose le probleme, je ne vois pas d'ou viens ton probleme, desole

  20. #20
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 35
    Points : 8
    Points
    8
    Par défaut
    tant pis merci quand meme
    mais si tu execute ton code tu vas voir tes ressources en memoire vive diminuer jusqu'a ce qu'il y en ait plus, et c ca mon probleme, et meme apres que le programme soit terminé la memoire n'est pas libérée

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Probleme lors de l'ecriture dans un fichier texte
    Par mddu66 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 15/09/2009, 17h24
  2. Comment sauter une ligne lors de l'ecriture dans un fichier
    Par Harald dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 29/05/2009, 18h01
  3. Probleme de "" lors de l ecriture dans un fichier
    Par mcphand dans le forum Windows Forms
    Réponses: 7
    Dernier message: 19/06/2007, 13h56
  4. [VBA] probleme lors de la creation d'un fichier
    Par tiotel dans le forum Access
    Réponses: 3
    Dernier message: 09/08/2006, 15h00
  5. Réponses: 9
    Dernier message: 15/05/2006, 14h29

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