1

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

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

我一直在阅读Task课程,我想这可能是要走的路,但微软没有给出一个很好的例子,那么我该如何完成呢?

4

3 回答 3

3

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

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

有关更多详细信息,请参阅MSDN File.ReadLines()

于 2013-04-19T13:50:56.883 回答
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
于 2013-04-22T17:42:19.477 回答
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 秒。

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

于 2013-04-19T15:16:53.483 回答