【问题标题】:VB.net - Faster text manipulation/storing to arrayVB.net - 更快的文本操作/存储到数组
【发布时间】:2016-05-27 12:14:37
【问题描述】:

我必须编写一个程序来读取 .txt 文件中的字符串,并处理数据以返回各种结果。 我遇到的问题是执行时间。

    Dim OpenAnswerFile As New OpenFileDialog
    OpenAnswerFile.Multiselect = True
    Dim strFileName() As String '// String Array.
    Dim tempStr As String = "" '// temp String for result.
    Dim FileName As String
    Dim Watcher As New Stopwatch
    If OpenAnswerFile.ShowDialog = DialogResult.OK Then 
        Watcher.Restart()
        For Each FileName In OpenAnswerFile.FileNames

            strFileName = IO.File.ReadAllLines(FileName) 
            For Each myLine In strFileName 
                tempStr &= myLine & vbNewLine 
            Next

        Next
        Watcher.Stop()
        Dim TimeToArrays = Watcher.Elapsed
        Watcher.Reset()
        '========================WRITE TO FILE
        Dim file As System.IO.StreamWriter
        file = My.Computer.FileSystem.OpenTextFileWriter("c:\test.txt", True)
        Watcher.Restart()
        file.Write(tempStr)
        file.WriteLine(TimeToArrays)
        file.WriteLine(Watcher.Elapsed)
        Watcher.Stop()
        file.Close()

        '========================WRITE TO FILE

    End If

将这个从 A 到 Z 运行到字典样式的 txt 文件大约需要一分钟,我发现总共只有超过 1MB 的文件。

有什么方法可以加快整个过程?

【问题讨论】:

  • 您是否尝试过连接文件而不将它们全部存储在字符串中?

标签: arrays vb.net performance visual-studio io


【解决方案1】:

试试这个代码 - 它在 6.5 秒内运行近 90Mb 的文件。

对代码的更改可以总结为:

  • 检查 DialogResult 并且在这部分例程完成之前不要迭代文件。

  • 在读取操作期间,使用Using...End Using 来提高IO 效率。

  • 使用List(of String) 来保存数据,而不是继续附加到字符串。从内存管理的角度来看,我认为这更有效。使用其他集合可能有更快的方法。

  • 在写操作过程中,使用Using...End Using来提高IO效率。

代码如下:

Sub DoItQuicker()

    Dim OpenAnswerFile As New OpenFileDialog
    OpenAnswerFile.Multiselect = True
    Dim strFileName() As String '// String Array.
    Dim strSingleFileContent As String
    Dim strFileData As New List(Of String)
    Dim FileName As String
    Dim Watcher As New Stopwatch

    'get user feedback
    If OpenAnswerFile.ShowDialog <> DialogResult.OK Then
        MessageBox.Show("Not OK")
        Exit Sub
    Else
        strFileName = OpenAnswerFile.FileNames
    End If
    OpenAnswerFile.Dispose()

    'read data
    Watcher.Restart()
    For Each FileName In OpenAnswerFile.FileNames

        Using sr As New IO.StreamReader(FileName)
            strSingleFileContent = sr.ReadToEnd
            For Each line As String In strSingleFileContent.Split(vbLf)
                strFileData.Add(line)
            Next
        End Using

    Next
    Watcher.Stop()
    Dim TimeToArrays = Watcher.Elapsed
    Debug.Print(Watcher.ElapsedMilliseconds)

    'write data
    Watcher.Restart()
    Using sw As New IO.StreamWriter("D:\temp\out.txt")
        For Each line As String In strFileData
            sw.WriteLine(line)
        Next
        sw.WriteLine(TimeToArrays)
        sw.WriteLine(Watcher.Elapsed)
    End Using
    Watcher.Stop()
    Debug.Write(Watcher.ElapsedMilliseconds)


End Sub

【讨论】:

  • 我刚刚对其进行了测试,它的运行时间为 0.09 秒,低于使用我的代码的 ~1m。非常感谢你。但是,我使用此代码的一个问题是输出将每个字母存储在自己的行中。如何每行存储一个完整的单词?
  • 每个文件的示例内容是什么?我生成了一些包含数千行foo,bar 的测试文件,仅用于测试。
  • https://we .tl/beABagB9cI 我已经在 WeTransfer 中上传了一个文件,供您查看我正在运行它。它真的很棒,它只通过将每个字母写入一个新行来保存 .txt 文件编辑:每个处理过的单词之后似乎也留下 2 个空行
  • @SpK 查看我的编辑 - 代码现在在 vbLf 上拆分,这是您的单词列表中的分隔符。所以整个 sub 应该适用于您的 A Words、B Words、C Words... Z Words 文件并编译成一长串单词的单个文件。 HTH。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 2014-12-23
  • 2017-12-07
  • 2016-02-21
  • 2021-10-02
相关资源
最近更新 更多