我的应用程序正在查看代理服务器日志中的大量文本文件(超过50万行)。问题是日志的正常StreamRead迭代可能需要花费过多的时间来处理,所以我正在寻找更快的东西。
在表单上,用户选择他们需要解析的文件,并输入最多三个站点过滤器进行检查。然后,应用程序打开文件并开始从文件中的每一行解析日期戳和网站URL。平均速度约为 每秒两行 ,因此对于包含200,000行的文件,此过程大约需要28小时来处理文件。
我一直在阅读Task课程,我认为这可能是要走的路,但微软并没有给出一个很好的例子,所以我怎么能完成呢?
答案 0 :(得分:3)
我认为您在阅读大文件时可以使用 File.ReadLines()。 根据MSDN:
ReadLines 和ReadAllLines方法的不同之处如下:使用ReadLines时,可以在返回整个集合之前开始枚举字符串集合;当您使用ReadAllLines时,必须等待返回整个字符串数组才能访问该数组。因此,当您使用非常大的文件时, ReadLines 可以更有效。
有关详细信息,请参阅MSDN File.ReadLines()
答案 1 :(得分:1)
不是猜测为什么它很慢,而是读取文件,处理行等,首先测量逐行读取文件所需的时间。
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秒。
运行后,您将知道问题是读取还是处理,或两者兼而有之。
答案 2 :(得分:1)
谢谢,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