1

ファイルの各行を読み取り、正規表現で定義された特定の形式に従ってデータを抽出するプログラムがあります。Match()ファイルの各行に対して複数回呼び出す代わりに、ファイルMatch()の内容全体に対して呼び出すことができます。より効率的な解決策はどれですか?

後者の選択にはRegexOptions.Multilineオプションが必要です。

アップデート:

ファイルはエンドユーザーによって指定されるため、大きくなる可能性があります(〜37000行、〜2MB)。すべての行に有効なエントリが含まれている必要はありません。

私が使用している正規表現はです^\s*(OPTL_\w*)\s*=>\s*(\d+)\s*$。たとえば、これはテキストで構成される行とは一致しますOPTL_Example => 123が、テキストで構成される行とは一致しませんFooBar => 999

4

4 に答える 4

2

したがって、速度または安定性を最適化するかどうかによって異なります。

これがエンド ユーザー アプリで、ファイル サイズやメモリを制御できない場合は、安全な方法で 1 行ずつ読み込んでメモリを保護します。ループの外側で正規表現を明確に構築して、ループ内で .Match を呼び出すだけです。ReadLine はかなり高速です。

解析の実行中に次の行を読み取るように、いくつかの並列処理を設定できます。しかし、その単純な正規表現は非常に高速であり、高速になるかどうかはわかりません。一度に行またはファイル全体をディスク IO でファイルを読み取る操作は、おそらく最も遅い操作です。

これが配布が制限されたサーバーアプリであり、速度が重要な場合は、すべて読んでください.

于 2012-11-28T15:27:34.593 に答える
0

それは多くの要因に依存するため、一般的および/または正しい答えはありません。I/Oの主要な速度。両方のソリューションをテストしてみませんか?サイズが2MBの場合、コンテンツ全体をより高速かつ効率的に処理できると期待しています。

于 2012-11-28T15:07:13.623 に答える
0

必要なメモリの制約によって異なります。ファイル全体で実行できる正規表現が複数ある場合は、ファイル全体をメモリに保持するのが効率的です。ただし、正規表現が行を変更する場合(そして、相互に依存するカスケード正規表現でこのプロセスを繰り返す場合)、行ごとのソリューションを使用します。

于 2012-11-28T14:43:42.090 に答える
0

行ごとのソリューションを選択すると、正規表現を並行して実行できる場合があります。問題は、並列処理によるすべてのオーバーヘッドに見合う価値があるかどうかです。正規表現が複雑である場合、および/または行の他の処理を行う場合、それを並行して実行できる場合は、少なくとも試してみます。

于 2012-11-28T14:53:46.370 に答える