Vb.net 快速读取文本文件中的行的快速方法
我的应用程序正在查看代理服务器日志中多达50万行的大型文本文件。问题是,日志的正常StreamRead迭代可能需要过多的时间来处理,因此我正在寻找更快的方法 在表单上,用户选择需要解析的文件,并输入多达三个站点过滤器进行检查。然后,应用程序打开文件并开始解析文件中每一行的日期戳和网站URL。平均速度约为每秒两行,因此对于一个包含200000行的文件,此过程大约需要28小时来处理一个文件 我一直在读这门课,我想这可能是一条应该走的路,但是微软没有给出一个很好的例子,所以我怎么才能做到呢?我想你可以在阅读大文件时使用File.ReadLines。 根据MSDN: ReadLines和ReadAllLines方法的区别如下:使用ReadLines时,可以在返回整个集合之前开始枚举字符串集合;使用ReadAllLines时,必须等待返回整个字符串数组,然后才能访问该数组。因此,当您处理非常大的文件时,ReadLines会更加高效 有关更多详细信息,请参见我认为您可以在读取大文件时使用File.ReadLines。 根据MSDN: ReadLines和ReadAllLines方法的区别如下:使用ReadLines时,可以在返回整个集合之前开始枚举字符串集合;使用ReadAllLines时,必须等待返回整个字符串数组,然后才能访问该数组。因此,当您处理非常大的文件时,ReadLines会更加高效Vb.net 快速读取文本文件中的行的快速方法,vb.net,text,task-parallel-library,streamreader,Vb.net,Text,Task Parallel Library,Streamreader,我的应用程序正在查看代理服务器日志中多达50万行的大型文本文件。问题是,日志的正常StreamRead迭代可能需要过多的时间来处理,因此我正在寻找更快的方法 在表单上,用户选择需要解析的文件,并输入多达三个站点过滤器进行检查。然后,应用程序打开文件并开始解析文件中每一行的日期戳和网站URL。平均速度约为每秒两行,因此对于一个包含200000行的文件,此过程大约需要28小时来处理一个文件 我一直在读这门课,我想这可能是一条应该走的路,但是微软没有给出一个很好的例子,所以我怎么才能做到呢?我想你可以
有关更多详细信息,请参见而不是猜测其速度慢的原因,而是读取文件、处理行等。首先测量逐行读取文件所需的时间
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秒?你不需要任务。您需要更改算法。任何导致读取所有行的方法都是一个等待发生的错误,除非您知道文件将很小。如前所述,每秒两行似乎很慢。