簡體   English   中英

快速讀取文本文件中行的更快方法

[英]A faster way to read lines in text files quickly

我的應用程序正在從代理服務器日志中查看巨大的文本文件(多達50萬行)。 問題在於日志的正常StreamRead迭代可能會花費大量時間來處理,因此我正在尋找更快的東西。

在表單上,​​用戶選擇他們需要解析的文件,並輸入最多三個站點篩選器進行檢查。 然后,應用程序打開文件,並開始從文件中的每一行分析日期戳和網站URL。 平均速度約為每秒兩行 ,因此對於其中包含200,000行的文件,此過程將花費大約28個小時來處理文件。

我一直在閱讀Task類,並且我認為這可能是采取的途徑,但是Microsoft並沒有給出很好的例子,那么我如何才能做到這一點?

我認為您可以在讀取大文件時使用File.ReadLines() 根據MSDN:

ReadLines和ReadAllLines方法的區別如下:使用ReadLines時,可以在開始返回整個集合之前開始枚舉字符串的集合; 使用ReadAllLines時,必須等待返回整個字符串數組,然后才能訪問該數組。 因此,當您處理非常大的文件時, ReadLines可能會更有效率。

有關更多詳細信息,請參見MSDN File.ReadLines()

它不是在猜測它為什么會變慢,而是讀取文件,處理行等,而是從逐行測量讀取文件所花費的時間開始。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim stpw As New Stopwatch
    Dim path As String = "path to your file here"
    Dim sr As New IO.StreamReader(path)
    Dim linect As Integer = 0
    stpw.Restart()

    Do While Not sr.EndOfStream
        Dim s As String = sr.ReadLine
        linect += 1
    Loop
    stpw.Stop()
    sr.Close()
    Debug.WriteLine(stpw.Elapsed.ToString)
    Debug.WriteLine(linect)
End Sub

我針對我擁有的20MB測試文件運行了此文件。 它接近3,000,000行(行很短)。 運行大約0.3秒。

運行此命令后,您將知道問題是讀取的還是處理的,或者兩者都是。

謝謝,dbasnett ...結果是:00:00:00.6991336 172900

信不信由你,我發現了問題。 我將文本框放在GroupBox內,並使用GroupBox.Text屬性將統計信息更新回用戶,使用GroupBox.Refresh()更新y的x行和找到的匹配項,等等,因此用戶對某些內容有所了解被發現。

通過忽略這些信息並放入進度條,掃描速度呈指數增長。 使用3個過濾器,我能夠在3:19分鍾的時間內解析172900行:

Scan complete!
Process complete!
Scanned 172900 lines out of 172900 lines.
Percentage (icc): 0.0052% (900 matches)
Percentage (facebook): 0.0057% (988 matches)
Percentage (illinois): 0.0005% (95 matches)
Total Matches: 1983
Elapsed Time: 00:03:19.1088851

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM