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 :

Remplir un fichier le plus rapidement possible


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 60
    Points : 41
    Points
    41
    Par défaut Remplir un fichier le plus rapidement possible
    Hello,

    J'aimerais trouver l'algorithme qui me permettrait de remplir un fichier, d'une taille inconnue à l'avance, le plus rapidement possible et également le moins couteux possible en terme de mémoire (alloc dynamique interdite).

    En gros moi je vois quelque chose de ce genre :
    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
     
    long Size, NbBytes;
    long lBuf = 0xAAAAAAAA;
    char cBuf = 0xAA;
     
    File.Open(pName)
     
    Size = File.Size();
    NbBytes = Size;
     
    File.Seek(0);
     
    if (Size > sizeof(long)) {
      do {
        File.Write(&lBuf, sizeof(long));
        NbBytes -= sizeof(long);
      } while(NbBytes >= sizeof(long));
    }
     
    while (NbBytes-- > 0) {
      File.Write(&cBuf, 1);
    }
     
    File.Close();
    En résumé écrire des pattern de 4 octets. Ou alors ai-je meilleur temps d'écrire des gros blocs de plusieurs dizaines d'octets?

    Qu'en pensez-vous?

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Je dirai par bloc de 512 ou 1024 octets plutôt que par bloc de 4 ou 10.

    Maintenant, tu peux aussi essayez cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FILE *fd = fopen();
    fseek(fd, SEEK_SET, <taille désirée>);
    fclose(fd);
    Je pense que cela te créé ton fichier de la bonne taille directement mais par contre, je ne sais pas le contenu du fichier.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Malheureusement chez moi cela ne fonctionne pas (Linux 2.6.27-11-generic) j'en déduis qu'il faut à tout prix écrire quelque chose et c'est logique je pense :
    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
     
    #include  <stdio.h>
    #include  <stdlib.h>
     
    #define  KB	* 1024L
     
    int main( void )
    {
    	FILE *fd = fopen("dummy", "wb");
     
    	if( fd!=NULL )
    	{
    		fseek(fd, 4 KB ,SEEK_SET);
    		fputc('X',fd);
    		fclose(fd);
    	}
     
    	return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    4,0K dummy
     
    00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    00001000  58                                                |X|
    00001001
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Il n'y a pas de méthode générique... Cela dépend de beaucoup de facteurs :
    • Le système d'exploitation,
    • La taille des buffers de fichiers de l'OS, qui peut être un pourcentage de la mémoire physique présente.
    • La mémoire cache présente sur les disques durs.
    • La taille des clusters sur la partition cible.


    Bref, pas de réponse "absolue"... Et sans allocation dynamique, ni buffer de taille "conséquente" alloués sur la pile (variable locale), ce sera encore plus difficile d'aller à la vitesse maximale.

    Dans tous les cas, prépare un bench quand même afin d'être objectif, et il faudrait même redémarrer le PC entre chaque test pour être certain de ne pas avoir d'effet de bord lié à la mémoire cache.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 60
    Points : 41
    Points
    41
    Par défaut
    Effectivement j'aurais du préciser que je suis en contexte embarqué, le filesystem pèse environ 1Mo (ça peut faire peur ) et je n'ai pas accès à la lib standard pour la gestion des fichiers.

  6. #6
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Je dirai par bloc de 512 ou 1024 octets plutôt que par bloc de 4 ou 10.

    Maintenant, tu peux aussi essayez cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FILE *fd = fopen();
    fseek(fd, SEEK_SET, <taille désirée>);
    fclose(fd);
    Je pense que cela te créé ton fichier de la bonne taille directement mais par contre, je ne sais pas le contenu du fichier.
    Non, mais truncate() et ftruncate() le font, par contre c'est POSIX et non standard C.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

Discussions similaires

  1. réecriture d'un fichier le plus rapide possible
    Par hassanJava dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 10/12/2010, 09h15
  2. Réponses: 50
    Dernier message: 19/10/2007, 23h38
  3. [VBA-E] Ecrire un fichier texte le plus rapidement possible
    Par spileo dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 13/09/2007, 20h51
  4. Réponses: 3
    Dernier message: 02/05/2007, 23h02
  5. Lire un fichier le plus rapidement possible
    Par Rodrigue dans le forum SL & STL
    Réponses: 9
    Dernier message: 02/05/2006, 10h43

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