Vb.net 快速读取文本文件中的行的快速方法

Vb.net 快速读取文本文件中的行的快速方法,vb.net,text,task-parallel-library,streamreader,Vb.net,Text,Task Parallel Library,Streamreader,我的应用程序正在查看代理服务器日志中多达50万行的大型文本文件。问题是,日志的正常StreamRead迭代可能需要过多的时间来处理,因此我正在寻找更快的方法 在表单上,用户选择需要解析的文件,并输入多达三个站点过滤器进行检查。然后,应用程序打开文件并开始解析文件中每一行的日期戳和网站URL。平均速度约为每秒两行,因此对于一个包含200000行的文件,此过程大约需要28小时来处理一个文件 我一直在读这门课,我想这可能是一条应该走的路,但是微软没有给出一个很好的例子,所以我怎么才能做到呢?我想你可以

我的应用程序正在查看代理服务器日志中多达50万行的大型文本文件。问题是,日志的正常StreamRead迭代可能需要过多的时间来处理,因此我正在寻找更快的方法

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

我一直在读这门课,我想这可能是一条应该走的路,但是微软没有给出一个很好的例子,所以我怎么才能做到呢?

我想你可以在阅读大文件时使用File.ReadLines。 根据MSDN:

ReadLines和ReadAllLines方法的区别如下:使用ReadLines时,可以在返回整个集合之前开始枚举字符串集合;使用ReadAllLines时,必须等待返回整个字符串数组,然后才能访问该数组。因此,当您处理非常大的文件时,ReadLines会更加高效

有关更多详细信息,请参见

我认为您可以在读取大文件时使用File.ReadLines。 根据MSDN:

ReadLines和ReadAllLines方法的区别如下:使用ReadLines时,可以在返回整个集合之前开始枚举字符串集合;使用ReadAllLines时,必须等待返回整个字符串数组,然后才能访问该数组。因此,当您处理非常大的文件时,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的测试文件运行了这个。这条线路将近300万条,很短。跑步大约需要0.3秒


运行此操作后,您将知道问题是读取还是处理,或者两者兼而有之。

不要猜测速度慢的原因,而是读取文件、处理行等。从测量逐行读取文件所需的时间开始

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的测试文件运行了这个。这条线路将近300万条,很短。跑步大约需要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

谢谢,德巴斯内特。。。结果是: 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

试一试怎么样?你是说StreamReader每秒只能读2行吗?这对我来说太慢了。每行有多长?你能告诉我们你代码的重要部分吗?阅读一行并解析日期戳和网站URL需要0.5秒?你不需要任务。您需要更改算法。任何导致读取所有行的方法都是一个等待发生的错误,除非您知道文件将很小。如前所述,每秒两行似乎很慢。试一试怎么样?你是说StreamReader每秒只读取2行吗?这对我来说太慢了。每行有多长?你能告诉我们你代码的重要部分吗?阅读一行并解析日期戳和网站URL需要0.5秒?你不需要任务。您需要更改算法。任何导致读取所有行的方法都是一个等待发生的错误,除非您知道文件将很小。如前所述,每秒两行似乎很慢。