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

Dotnet Discussion :

Chargement fichier texte bloc par bloc [VB.NET]


Sujet :

Dotnet

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 57
    Points : 40
    Points
    40
    Par défaut Chargement fichier texte bloc par bloc [VB.NET]
    Bonjour,

    Je suis actuellement en stage et j'ai une problématique. Je possède un fichier texte de 39238 ligne. Mon traitement sur ce fichier fonctionne très bien mais le temps d’exécution est énorme. Voila le code que j'utilise pour charger le fichier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     'Variable pour récuperer toute les lignes du fichier log
            Dim listeLigne As IEnumerable(Of String)
     
            'On récupere toute les ligne du fichier
            listeLigne = File.ReadLines(chemin)
    J'ai eu pour idée de réduire ce temps en partitionnant mon fichier mais je n'ai pas réussi a écrire un algorithme qui marche.
    Voila ce que j'ai actuellement :

    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
     
      'DECLARER un lecteur de fichier 
            Dim monlecteur As StreamReader
            monlecteur = StreamReader.Null
     
            'DECLARER une collection pour les lignes du fichier 
            Dim meslignes As New ArrayList
            Try
                'cheminCompletFichier est le chemin complet du fichier à lire 
                monlecteur = New StreamReader(cheminCompletFichier)
                With monlecteur
                    'POSITIONNER le flux au début du fichier 
                    .BaseStream.Seek(0, SeekOrigin.Begin)
                    .BaseStream.Seek(100, SeekOrigin.End)
                    .BaseStream.WriteTimeout = 5000
                    'TANT QUE le lecteur a quelquechose à lire 
                    While (.Peek > 0)
                        'LIRE une ligne du fichier et l'ajouter à meslignes 
                        Console.WriteLine(.ReadLine)
                        meslignes.Add(.ReadLine)
                    End While
                End With
            Catch ex As Exception
                Debug.WriteLine(ex.ToString)
                Console.WriteLine(ex.Message)
            Finally
                'FERMER le lecteur en tout etat de cause 
                monlecteur.Close()
            End Try
     
            Return (meslignes)
     
        End Function

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par kevin01330 Voir le message
    J'ai eu pour idée de réduire ce temps en partitionnant mon fichier
    Qu'est-ce qui te fait penser que ça fonctionnerait mieux ? As-tu des raisons de penser que c'est la lecture du fichier qui est longue, plutôt que le traitement sur les lignes ? Lire un fichier de 40000 lignes, normalement ça ne prend pas très longtemps...

    Je peux me tromper (surtout sans avoir vu le code concerné), mais je soupçonne que le problème vient de la façon dont tu utilises listeLigne. Est-ce que par hasard ça fonctionne mieux si tu utilises ReadAllLines à la place ?

    La méthode ReadLines renvoie un IEnumerable(Of String), qui lit le fichier au fur et à mesure que tu énumères les lignes. Il faut donc faire attention à énumérer le résultat une seule fois, sinon ça lit le fichier plusieurs fois... ReadAllLines, au contraire, charge tout de suite tout le fichier en mémoire et renvoie un tableau de String, qui n'a plus de lien avec le fichier (d'où ma suggestion)

    Si tu peux, poste ton code actuel pour le traitement des lignes, avec un peu de chances on verra l'origine du problème.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 57
    Points : 40
    Points
    40
    Par défaut
    Bonjour,

    Tout d'abord je te remercie de ton intérêt pour ma question. Ensuite, j'ai réussi a réduire le temps en faisant le traitement sur chaque ligne. De ce fait, le temps d’exécution n'est plus que de 10 sec au lieu de 4 minutes. Je te remercie.

    Cordialement,
    Kévin

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 30/07/2012, 10h14
  2. Réponses: 3
    Dernier message: 16/03/2011, 14h36
  3. Ouvrir un fichier texte avec le bloc Notes
    Par guidzit dans le forum Access
    Réponses: 2
    Dernier message: 25/09/2006, 14h45
  4. Lire un fichier Texte d'1 bloc dans une chaine
    Par User dans le forum Langage
    Réponses: 6
    Dernier message: 13/09/2006, 21h56
  5. Réponses: 7
    Dernier message: 23/03/2005, 22h23

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