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 :

Lecture rapide fichier binaire & Buffer


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2011
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 62
    Par défaut Lecture rapide fichier binaire & Buffer
    Bonjour à tous,

    Actuellement j'ai un code qui lit un fichier binaire octet par octet. (et convertie le contenu en int ou string...). Jusqu'à maintenant je lisai directement le fichier binaire.

    Mais les fichiers qui sont lus sont très gros (jusqu'au Go). On m'a donc conseillé de passer par les buffers pour gagner en rapidité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::ifstream fichier(filestdf.c_str(),std::ios_base::binary);                 
    std::stringstream buffer;
     
    buffer << fichier.rdbuf();
    fichier.close();
    Après beaucoup de modifications, mon programme fonctionne comme auparavant sauf qu'il est encore plus lent! Donc apparament il faudrai allouer la mémoire du buffer, ou/et "lire le fichier dans le buffer" au fur et à mesure (morceau par morceau).

    Mon problème est que je ne trouve pas la syntaxe pour tester ce que j'explique plus haut. Mes questions : Est ce que la méthode que je veux appliquer est pertinente (point de vue rapidité)? Si oui, quelles sont les fonctions ou la méthode que je doit appliquer?

  2. #2
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    Le plus rapide consiste a passer par des fichiers memory mapped.
    Regarde du cote de boost::iostreams qui fournit une interface portable pour ce genre de chose.

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2011
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 62
    Par défaut
    Est ce que tu pourrais détailler le concept des memory mapped? Et quelles sont les différences avec l'utilisation de boost::iostreams?

  4. #4
    screetch
    Invité(e)
    Par défaut
    le file mapping va créer une vue sur ton fichier comme si celui-ci etait chargé en mémoire, sauf qu'il ne l'est pas. Cela va créer une sorte de buffer virtuel. Lorsque tu lis dans ce buffer, si le fichier n'est pas encore lu a cet endroit la le système d'exploitation va le chercher sur le disque (ce qui prend un peu de temps bien sur) et le mettre la.
    Le gain dépend principalement de la facon dont tu accèdes aux données; si il s'agit d'une lecture aléatoire il n'y a pas grand chose a faire mais si c'est sequenciel, ca va vite.
    Avant d'en arriver la, si on te conseilles de passer par les buffers es tu sûr du bout de code que tu as posté? L'idée principale derrière le buffer est de lire un certain nombre de données (mettons 1 meg), de traiter ce mégaoctet (sans lire sr le disque puisque tout a déjà été lu), puis passer au meg suivant, lire un meg...
    ensuite il y a beaucoup de moyens d'accelerer; par exemple tu peux lire 1 meg, puis en parallèle lire un autre meg, et sur un autre thread, faire le traitement du premier megaoctet. Ainsi tu te retrouve avec un thread qui lit sur le disque et un autre qui utilise les données (ca demande un peu de synchronisation des threads donc seulement si tu as besoin d'un truc très rapide)

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2011
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 62
    Par défaut
    Merci pour toutes ces explications très instructives.

    Oui je suis sur de mon code, mais bon j'affecte tout le fichier au buffer. Mais du coup, l'accès au données devient très long. J'y accède comme un tableau.

    La lecture de mon fichier, doit se faire octet par octet car c'est en lisant au fur et mesure le fichier que je sais comment le lire et faire mais manip en conséquence (je ne sais pas si c'est très clair).

    L'idée était de charger une partie de mon fichier dans le buffer de le lire, et ensuite de charger la suite de mon fichier, lire, etc etc. Mais je ne sais pas comment le faire... Et mes recherches sur boost::iostreams et les memory mapped n'ont pas été très concluantes...

    Serait-il possible d'avoir un bout d'exemple pour l'une de ces méthodes?

  6. #6
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918

Discussions similaires

  1. Lecture de fichier binaire
    Par nuans dans le forum MATLAB
    Réponses: 23
    Dernier message: 21/05/2007, 10h00
  2. Lecture de fichier binaire et gestion de fin de fichier
    Par habasque dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 02/05/2007, 17h06
  3. lecture ecriture fichier binaire
    Par jonckers dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/04/2007, 09h12
  4. Réponses: 5
    Dernier message: 26/03/2007, 01h30
  5. lecture de fichier binaire
    Par Salim6 dans le forum C
    Réponses: 3
    Dernier message: 07/11/2005, 19h56

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