none
Tableau de grande dimmensions RRS feed

  • Question

  • Bonjour

    J'ai un fichier qui peut contenir 3 ou 4 millions de lignes.

    J'ai besoin de spliter ce fichier en ligne dans un tableau du type

    dim lignes() as String

    Comment faire pour obtenir un tableau de dimension UInteger.MaxValue ?

    Sinon comment gérer la lecture d'un gros fichier sans le faire ligne par ligne ?

    Merci pour votre aide

    Bernard


    Bernard Bouree

    samedi 3 décembre 2016 16:27

Réponses

  • Par ex avec StreamReader comme proposé en réponse à :

    https://www.codeproject.com/questions/406924/how-to-read-a-large-text-file-in-vb-net

    • Marqué comme réponse BernardBouree dimanche 4 décembre 2016 08:28
    samedi 3 décembre 2016 21:28
  • Pour lire un fichier de 2 millions de ligne vous pouvez faire de 2 façons (au moins) en utilisant un StreamReader,

    la lecture d'un seul tenant .ReadToEnd et .ReadToEndAsync.

    ReadToEnd bloquera l'UI jusqu'à la fin de la lecture, alors que .ReadToEndAsync rend la main à l'interface.

    Cela dépend de ce que vous voulez faire.

    Pour tester les performances j'ai créé un fichier de 2 millions de ligne aléatoires (quelques lignes dessous):

    0  ëçyxpkc1ywvkj4êê56m-buîwaî''ùeè-dgwgïûînlè
    1  ûnïîlp'9fzèok5'vàiagr5ueary9df9îwz0hn-ûêàguvx2klênfdjsy43àê52b40é32ë
    2  n53zmu6â0zp2gzâ43mt40vîzûc0êoûê1xtmzx-79c8jè6uàuiçjïâvï3enûivioj3znîldp
    ...
    1999999  4ûxùa1ù7dxèê18tukexéêï'9véjpyïjt6â14êr4ù4jxês-1-v9xvfçheîyfwémrqlgôfeéû3k5ëvjpzuûj4éiîll
    2000000  êdfjraè2eskjç46içjk7ï6s0êïos2fy5yêuuùù43eùd7mjd

    Pour la lecture avec les deux méthodes

    Private Async Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Dim StartTime As New DateTime
            Dim EndTime As New DateTime
            Dim DureeEcriture As New TimeSpan
    
            'Lecture des lignes en direct
            NomFichier = Application.StartupPath & "\2millionsDeLignes.txt"
            StartTime = DateTime.Now
            Using reader As StreamReader = File.OpenText(NomFichier)
    
                strLignesLues = reader.ReadToEnd()
    
            End Using
            
            EndTime = DateTime.Now
            DureeEcriture = EndTime - StartTime
            RichTextBox1.AppendText("Lecture de 2 millions de lignes avec StreamReader.ReadToEnd en " & DureeEcriture.TotalMilliseconds & " ms" & Environment.NewLine)
    
            'Lecture des lignes avec la version Async
            StartTime = DateTime.Now
            Using reader As StreamReader = File.OpenText(NomFichier)
    
                strLignesLues = Await reader.ReadToEndAsync()
    
            End Using
            EndTime = DateTime.Now
            DureeEcriture = EndTime - StartTime
            RichTextBox1.AppendText("Lecture de 2 millions de lignes avec StreamReader.ReadToEndAsync en " & DureeEcriture.TotalMilliseconds & " ms" & Environment.NewLine)
        End Sub

    La première méthode, bloquante prend <2s et la méthode Async 37s:

    Ensuite la séparation des lignes est faite avec le Split:

    strTableau = strLignesLues.Split(vbLf)

    • Marqué comme réponse BernardBouree dimanche 4 décembre 2016 08:28
    samedi 3 décembre 2016 22:39

Toutes les réponses

  • Par ex avec StreamReader comme proposé en réponse à :

    https://www.codeproject.com/questions/406924/how-to-read-a-large-text-file-in-vb-net

    • Marqué comme réponse BernardBouree dimanche 4 décembre 2016 08:28
    samedi 3 décembre 2016 21:28
  • Pour lire un fichier de 2 millions de ligne vous pouvez faire de 2 façons (au moins) en utilisant un StreamReader,

    la lecture d'un seul tenant .ReadToEnd et .ReadToEndAsync.

    ReadToEnd bloquera l'UI jusqu'à la fin de la lecture, alors que .ReadToEndAsync rend la main à l'interface.

    Cela dépend de ce que vous voulez faire.

    Pour tester les performances j'ai créé un fichier de 2 millions de ligne aléatoires (quelques lignes dessous):

    0  ëçyxpkc1ywvkj4êê56m-buîwaî''ùeè-dgwgïûînlè
    1  ûnïîlp'9fzèok5'vàiagr5ueary9df9îwz0hn-ûêàguvx2klênfdjsy43àê52b40é32ë
    2  n53zmu6â0zp2gzâ43mt40vîzûc0êoûê1xtmzx-79c8jè6uàuiçjïâvï3enûivioj3znîldp
    ...
    1999999  4ûxùa1ù7dxèê18tukexéêï'9véjpyïjt6â14êr4ù4jxês-1-v9xvfçheîyfwémrqlgôfeéû3k5ëvjpzuûj4éiîll
    2000000  êdfjraè2eskjç46içjk7ï6s0êïos2fy5yêuuùù43eùd7mjd

    Pour la lecture avec les deux méthodes

    Private Async Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Dim StartTime As New DateTime
            Dim EndTime As New DateTime
            Dim DureeEcriture As New TimeSpan
    
            'Lecture des lignes en direct
            NomFichier = Application.StartupPath & "\2millionsDeLignes.txt"
            StartTime = DateTime.Now
            Using reader As StreamReader = File.OpenText(NomFichier)
    
                strLignesLues = reader.ReadToEnd()
    
            End Using
            
            EndTime = DateTime.Now
            DureeEcriture = EndTime - StartTime
            RichTextBox1.AppendText("Lecture de 2 millions de lignes avec StreamReader.ReadToEnd en " & DureeEcriture.TotalMilliseconds & " ms" & Environment.NewLine)
    
            'Lecture des lignes avec la version Async
            StartTime = DateTime.Now
            Using reader As StreamReader = File.OpenText(NomFichier)
    
                strLignesLues = Await reader.ReadToEndAsync()
    
            End Using
            EndTime = DateTime.Now
            DureeEcriture = EndTime - StartTime
            RichTextBox1.AppendText("Lecture de 2 millions de lignes avec StreamReader.ReadToEndAsync en " & DureeEcriture.TotalMilliseconds & " ms" & Environment.NewLine)
        End Sub

    La première méthode, bloquante prend <2s et la méthode Async 37s:

    Ensuite la séparation des lignes est faite avec le Split:

    strTableau = strLignesLues.Split(vbLf)

    • Marqué comme réponse BernardBouree dimanche 4 décembre 2016 08:28
    samedi 3 décembre 2016 22:39
  • Bonjour , merci beaucoup!

    Bernard


    Bernard Bouree

    dimanche 4 décembre 2016 08:28