1

私のアプリケーションは、プロキシ サーバー ログから巨大なテキスト ファイル (50 万行まで) を見ています。問題は、ログの通常の StreamRead 反復が処理に非常に長い時間がかかる可能性があることです。そのため、より高速なものを探しています。

フォームで、ユーザーは解析する必要があるファイルを選択し、チェックするサイト フィルターを最大 3 つ入力します。次に、アプリケーションはファイルを開き、ファイルの各行から日付スタンプと Web サイト URL の解析を開始します。平均速度は1 秒あたり約 2 行なので、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()を使用して行xのyを更新し、見つかった一致などを更新していたので、ユーザーは何のアイデアを持っていましたか?発見されていました。

その情報を省略してプログレス バーを表示することで、スキャンの速度が飛躍的に向上しました。3 つのフィルターを使用して、172900 行を 3 分 19 秒で解析できました。

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 に答える