0

テキストビューに出力する1〜5MBのログファイルから読み取り、別のテキストビューに出力する特定の行を検索しています。現在、わずか 1 MB のファイルに約 1 分かかります。私が使用している方法以外に、行または文字列を検索するより高速な方法を知っている人はいますか?

Imports EnterpriseDT.Net.Ftp

Public Class Form1

Private Sub SettingsToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles SettingsToolStripMenuItem.Click

End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    Dim sw As New Stopwatch
    Dim FullLine As String = ""
    Dim ScriptLine As String = ""
    sw.Start()

    Dim ll As New Queue(Of String)

    Dim i As String = ""

    Using TestFile As New IO.StreamReader("c:\test.txt", System.Text.Encoding.Default, False, 4096)

        Using OutFile As New IO.StreamWriter("c:\SBOutFile.txt", False, System.Text.Encoding.Default, 4096)

            While TestFile.EndOfStream = False

                i = TestFile.ReadLine

                If i.Contains(".sqf") And i.Contains("handleGear.sqf") = False Then
                    ScriptLine = ScriptLine & i & vbNewLine & vbNewLine
                    FullLine = FullLine & i & vbNewLine & vbNewLine
                Else
                    FullLine = FullLine & i & vbNewLine & vbNewLine
                End If

            End While

        End Using

    End Using

    sw.Stop()
    TextBox1.Text = FullLine
    TextBox2.Text = ScriptLine
    RichTextBox1.AppendText(String.Format("Run_Queue took {0} Milliseconds." & Environment.NewLine, sw.ElapsedMilliseconds))
End Sub

Private Sub Button1_Click_1(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Try
        'connect to ftp server
        Dim ftp As New FTPConnection
        ftp.ServerAddress = "-"
        ftp.ServerPort = "-"
        ftp.UserName = "-"
        ftp.Password = "-"
        ftp.Connect()
        ftp.ChangeWorkingDirectory("-")
        ftp.TransferType = FTPTransferType.BINARY

        'download a file
        ftp.DownloadFile("c:\test.txt", "scripts.log")

        'ftp.RenameFile("scripts.log", "scripts_test.log")

        'close the connection
        ftp.Close()

    Catch ex As Exception
        MessageBox.Show(ex.Message.ToString())
    End Try
End Sub

Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click

End Sub

クラス終了

4

2 に答える 2

1

読んでいるときに大量の読み取りと連結を行っていることを考えると、時間/パフォーマンスの問題の一部であると思われます。String は技術的に不変であるため、ScriptLine と FullLine の宣言を String 型から StringBuilder に変更することを検討することになるでしょう。つまり、各連結は、実際には前のオブジェクトの解体であり、その場所に新しいオブジェクトを作成することになります。StringBuilders は、大量の連結シナリオ向けに特別に設計されています。ループが終了したら、文字列に戻すことができます。

また、コンパイルされた正規表現は、String.Contains よりも高速に検索される場合があります。正規表現文字列は "(?!handleGear).sqf" のようなものになります。これは、"文字列 ".sqf" の前にある "handleGear" 以外の 0 個以上の文字列を見つけることを意味します。

私はその式をテストする機会がなかったので、その警告とともに提供されます。テストをまとめる機会があれば、喜んで修正してお知らせします。

幸運を!

于 2012-07-11T20:17:40.643 に答える
0

最終的に思いついたものを投稿したかっただけです。それは私が持っていたものに比べて非常に大きな改善でした.

'Read file
    Dim sw As New Stopwatch
    Dim FullLine As String = ""
    Dim ScriptLine As String = ""
    sw.Start()

    Dim ll As New Queue(Of String)

    Dim i As String = ""
    Dim builder As New StringBuilder
    Using TestFile As New IO.StreamReader("c:\test.txt", System.Text.Encoding.Default, False, 4096)

        builder.AppendLine("Started at: " & DateTime.Now.ToLongTimeString().ToString)
        RichTextBox1.AppendText(Now.ToShortTimeString & " Reading Log File Started" & vbNewLine)
        RichTextBox1.SelectionStart = RichTextBox1.TextLength

        Dim rowCount As Integer = 0

        Do Until TestFile.EndOfStream
            ScriptLine = TestFile.ReadLine
            ScriptLine = LCase(ScriptLine)
            If InStr(ScriptLine, ".sqf") > 0 And InStr(ScriptLine, "handlegear.sqf") < 1 Then 'And InStr(ScriptLine, "createmarkerlocal.sqf") < 1 And InStr(ScriptLine, "setmarkerposlocal.sqf") < 1 
                builder.AppendLine(ScriptLine)
                builder.AppendLine()
            End If
            rowCount = rowCount + 1
        Loop
        builder.AppendLine(Now.ToShortTimeString & "==== Searched " & rowCount & " rows" & vbNewLine)
        builder.AppendLine(Now.ToShortTimeString & " Finished" & vbNewLine)
    End Using

    sw.Stop()

    RichTextBox2.AppendText(builder.ToString & vbNewLine)

    RichTextBox1.AppendText(Now.ToShortTimeString & String.Format(" Run_Queue took {0} Milliseconds." & Environment.NewLine, sw.ElapsedMilliseconds))
于 2012-07-18T15:54:08.557 に答える