【问题标题】:A faster way to read lines in text files quickly一种快速读取文本文件中行的更快方法
【发布时间】:2015-06-30 06:23:25
【问题描述】:

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

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

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

【问题讨论】:

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

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


【解决方案1】:

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

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

更多详情请见MSDN File.ReadLines()

【讨论】:

    【解决方案2】:

    与其猜测它为什么慢,不如从测量逐行读取文件所需的时间开始。

    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 秒。

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

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2010-10-15
        • 2017-08-17
        • 1970-01-01
        • 2013-07-29
        • 2012-08-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多