[英]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.