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 :

La façon la plus rapide de lire dans un fichier ?


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 309
    Points : 61
    Points
    61
    Par défaut La façon la plus rapide de lire dans un fichier ?
    Bonjour, je cherches la façon la plus rapide de lire tout les octets d'un fichier de plus de 50mb.

    Jusqu'ici je lisais cela à coup de 1024 octets, mais quand j'ai un fichier d'environ 1gig, ça prend quand même 4-5 min à mon pc pour lire tout le fichier.

    Voici le code que j'utilises en ce moment:

    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
    30
    31
    32
    33
    34
    35
    #include <cstdio>
    #include <fstream>
    #include <iostream>
    #include <vector>
     
    using namespace std;
     
    int main()
    {
     
    	const unsigned long n = 1024;
     
    	vector<char> Temp(n); 
     
    	ifstream myFile ("X:\\fichier", ios::in | ios::binary);
     
    	if (myFile.is_open())
    	{
     
    		do
    		{		
     
    			myFile.read (&Temp[0], n);
     
     
    		} while(myFile.good());
     
    		myFile.close();
     
    		cin.get();
     
    	}
     
    	return 0;
    }

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Si tu as besoin de la rapidité maximale, il te faut ici quitter le C++ standard et utiliser directement des fonctions spécifiques à ton OS.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    En meme temps je vais peut etre dire une connerie... Mais 4-5 min pour charger 1Go... Ca me parait pas super long...

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2002
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 21
    Points : 19
    Points
    19
    Par défaut
    Salut

    il me semble avoir lu ds la doc de $soft que la maniere la plus rapide c'est de lire un fichier par chunk de 64kB soit 65536 bytes

    D'ailleurs j'ai lu et teste et effectivement c'est ca. Je sais pas si sur une autre plateform c'est la meme chose ....

    Et si tu utilises la STL c'est transparent, la STL utilise en intern l'API de l'OS sur lequel tu es.


    @+
    Seb

  5. #5
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 754
    Points : 10 719
    Points
    10 719
    Billets dans le blog
    3
    Par défaut
    Moi aussi ça me parrait assez long. Augmente la taille de ton buffer, compile en release, ... Le but est de réduire le nombre de lectures. Là tu en fait 1 million. Multiplie la taille de ton buffer par 1024 et tu en fera plus que 1000... Le surcout C++ devrait alors devenir négligeable.
    Si ça ne l'est pas, alors comme te l'a dit Loïc il faudra passer par les fonctions système.

  6. #6
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    Tu te fais un benchmarck pour regarder suivant la taille de ton buffer, le temps que met le chargement, tu devrai avoir une sorte de parabole tournée vers le haut, alors tu regarde pour quelle taille de buffer tu as le temps de chargement mini...

    C'est ce que j'avais fait avec les fonctions des windows WriteFile et ReadFile (j'avais trouvé un buffer de 2048 octets)

    Moi aussi ça me parrait assez long. Augmente la taille de ton buffer, compile en release, ... Le but est de réduire le nombre de lectures. Là tu en fait 1 million. Multiplie la taille de ton buffer par 1024 et tu en fera plus que 1000... Le surcout C++ devrait alors devenir négligeable.
    Il est vrai que le nombre d'appels sera diminué mais après c'est la fonction qui mettera du temps à s'executer car elle devra travailler sur un buffer trop grand....

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 309
    Points : 61
    Points
    61
    Par défaut
    Donc en résumé, il faudrait que je lise par bloc de 65536 octets tout en utilisant les API win32 ?

  8. #8
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    Ben je pense que les fontions de windows sont pas mal et qu'il est facile de faire quelque chose de performant avec....

  9. #9
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 754
    Points : 10 719
    Points
    10 719
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Rafy
    Il est vrai que le nombre d'appels sera diminué mais après c'est la fonction qui mettera du temps à s'executer car elle devra travailler sur un buffer trop grand....
    je comprends pas trop ce que tu veux dire. Si y'a 1Go de données à traiter, ben faut traiter 1Go de données. Avoir un grand buffer peut poser problème si la mémoire est saturée et que ça swappe. Mais 1Mo, de nos jours, ça me parrait pas énorme pour un usage ponctuel.

  10. #10
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    Ce que je veux dire c'est que si on envoye un tout petit buffer à la fonction, alors il va falloir appeler plein de fois la fonction, c'est ça qui va nous ralentir, mais si au contraire on donne un buffer géant à la fonction, oui il faudra l'appeler moins de fois, mais c'est la fonction qui va peiner à traiter le gros buffer qu'on lui à donné, ça sera la fonction qui va nous limiter....
    Ce que je voulais dire c'est qu'il faut lui envoyer un buffer pas trop grand pour que la fonction ne nous limite pas, et pas trop petit pour que ce ne soit pas le nombre d'apelle qui nous pénalise...

  11. #11
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    d'apres mes souvenirs des cours d'info de programmation systeme, quand tu fais une lecture de fichier, ifstream "bufferise" la lecture c'est a dire que c'est pas parce que tu demandes une lecture octet par octet que la methode va lire de cette facon.

    Il va livrer l'info selon tes besoins mes l'acces disque n'est pas proportionné à la taille de ton buffer.

  12. #12
    Membre habitué
    Inscrit en
    Avril 2002
    Messages
    180
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 180
    Points : 157
    Points
    157
    Par défaut
    tu peux utiliser la fonction bas niveau read() de io.h pour lire ton fichier mais le guin de temp sera minime

    4 a 5 minute pour lire 1Gig ces rapide si tu travaille sur un Vic-20

  13. #13
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 754
    Points : 10 719
    Points
    10 719
    Billets dans le blog
    3
    Par défaut
    ifstream bufferise, et l'OS aussi derrière. Mais si tu te reposes trop sur ça, chaque lecture d'octet va être très couteuse car il faut faire un appel de fonction a chaque fois. Alors que si tu gères ton buffer, lire un octet est immédiat (adresse dans un tableau).

    Pour l'histoire de la fonction qui peine avec un gros buffer, désolé mais je comprend pas pourquoi elle peine.

  14. #14
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    Pour l'histoire de la fonction qui peine avec un gros buffer, désolé mais je comprend pas pourquoi elle peine.
    Ben alors je comprend pas pourquoi on utilise pas alors des buffers aussi gros que le fichier que l'on veut lire ?
    Dans ce cas si on veux lire 1 Go dans un fichier on peut alors donner la fonction un buffer de 1 Go ?
    ça ne va pas être super lent ?

  15. #15
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 754
    Points : 10 719
    Points
    10 719
    Billets dans le blog
    3
    Par défaut
    Ce serait l'idéal. Mais on est limité par la taille de la RAM disponible, donc faut voir moins grand. Le truc est de trouver un bon compromis entre gain de performance mesurable et occupation mémoire. Il arrive un moment où augmenter la taille du buffer n'apporte plus grand chose, si ce n'est une consommation mémoire supérieure, qui peut donc être qualifiée d'inutile. Faut tester...

  16. #16
    Membre habitué
    Avatar de zdra
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 164
    Points : 187
    Points
    187
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    Ce serait l'idéal. Mais on est limité par la taille de la RAM disponible, donc faut voir moins grand. Le truc est de trouver un bon compromis entre gain de performance mesurable et occupation mémoire. Il arrive un moment où augmenter la taille du buffer n'apporte plus grand chose, si ce n'est une consommation mémoire supérieure, qui peut donc être qualifiée d'inutile. Faut tester...
    Surtout si c'est pour que l'OS te swap ton buffer...

  17. #17
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    Vous allez dire qu'il faut mais ceci fonctionne avec des fonctions qui sont d'ordre n ou inférieur.
    Suivez mon résonnement :
    Si on a une fonction d'ordre n² par exemple. Alors l'appel de la fonction pour un buffer de taille 2*d sera plus long que pour deux appels de la fonction pour un buffer de taille d....
    C'est ça que je veux dire...
    Suis-je dans le faux ?
    Ou bien à coté de la plaque :
    Ne ma laissez pas dans l'ignorance please...

  18. #18
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 754
    Points : 10 719
    Points
    10 719
    Billets dans le blog
    3
    Par défaut
    Je comprend l'idée, mais dans la pratique, ça n'a pas grand chose à voir. Faut distinguer la lecture des données de leur traitement. Si tu as une fonction en O², que tu dois appliquer sur l'ensemble du fichier. Quoique tu fasses, tu devras appliquer la fonction sur toutes les données du fichier, en tant que gros bloc contigue. Si tu morcelles ton traitement, tu n'auras pas le même résultat donné par la fonction.
    Et lire des bloc de 1Mo ne t'empêche pas d'analyser ce gros bloc par petits morceaux de 1Ko.

  19. #19
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    ok, compris.
    Je m'incline et comprends....
    C'est donc pareil pour la lecture et l'écriture.
    L'acces se fait au fichier par l'intermédiaire d'un tampon pour ne pas avoir de grandes quantité de donnée stocké en mémoire (ce qui pourrait avoir des consequences sur les performances). Le travail effectué par la suite sur le tampon est libre, on peut travailler comme on veut sur les données...
    Quoi qu'il arrive la lecture (et l'écriture je suppose), devront être fait sur l'ensemble du fichier, ne pas prendre une grande quantité de donnée n'est que reculer pour mieux sauter ....

    Merci Aurelien

Discussions similaires

  1. la façon la plus rapide pour lire un ficher en c++
    Par mohsenuss91 dans le forum C++
    Réponses: 3
    Dernier message: 10/03/2015, 15h54
  2. Plus de données à lire dans le socket
    Par le tonbre 2011 dans le forum Oracle
    Réponses: 1
    Dernier message: 24/08/2011, 15h50
  3. Plus de données à lire dans le socket
    Par schtroumpfNormand dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 05/08/2011, 12h20
  4. il n'y a plus de données à lire dans le socket
    Par nawal59 dans le forum Designer
    Réponses: 1
    Dernier message: 05/10/2010, 19h04
  5. Réponses: 2
    Dernier message: 26/09/2006, 20h42

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