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

时间:2013-04-19 13:18:17

标签: vb.net text task-parallel-library streamreader

我的应用程序正在查看代理服务器日志中的大量文本文件(超过50万行)。问题是日志的正常StreamRead迭代可能需要花费过多的时间来处理,所以我正在寻找更快的东西。

在表单上,​​用户选择他们需要解析的文件,并输入最多三个站点过滤器进行检查。然后,应用程序打开文件并开始从文件中的每一行解析日期戳和网站URL。平均速度约为 每秒两行 ,因此对于包含200,000行的文件,此过程大约需要28小时来处理文件。

我一直在阅读Task课程,我认为这可能是要走的路,但微软并没有给出一个很好的例子,所以我怎么能完成呢?

3 个答案:

答案 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
相关问题