2012-03-19 4 views
0

最大35MBまでのテキストファイルを解析しています。ファイルを2回読むのをやめようとしています

私は現在、このコードしている:

const string show_BLOCK_DELIMITER = "show "; 
const string Show_BLOCK_DELIMITER = "Show "; 
const string Begin_SHOW_HW_DELIMITER = @"show hardware internal errors"; 

とキャプチャするかを制御このロジック:

if ((line == null) || (trimmed.StartsWith(show_BLOCK_DELIMITER)) 
    || (trimmed.StartsWith(Show_BLOCK_DELIMITER)) 
|| (trimmed.Contains(Begin_SHOW_HW_DELIMITER))) 
    { 
    //stuff happens here 
    } 

私は捕獲方法は、ファイルを読み込まれ、Iで始まる行を打ったとき'ショー'または 'ショー'それは私がキャプチャしたいものかどうかを確認するためにチェックします。もしそうなら、私は 'show'または 'show'で始まる次の行までキャプチャを開始します。新しいコードは、定数 'Begin_SHOW_HW_DELIMTER'の間のものをキャプチャすることになっていますが、ここでは入力のサンプルです。 "Module-N#"で始まる2つのブロック、つまり文字列があります.Fc-macの行は「show」で始まりますが、コードをキャプチャしたいもののリストにはないのでそれが新しいブロックだと思って、彼らは捕らえられません。この時点で、私はこの新しい部分を扱い、ファイルを2回読むだけの別の方法について疑問に思っています。 if/elseステートメントはすでにかなり複雑です。

モジュール-1#表示ハードウェアの内部エラー

show hardware internal fc-mac port 1 interrupt-counts

show hardware internal fc-mac port 2 interrupt-counts

モジュール-2#ショーのハードウェアの内部エラー

show hardware internal fc-mac port 1 interrupt-counts

show hardware internal fc-mac port 2 interrupt-counts

+0

ファイルを2回読んでいる部分はどこですか? – Ryan

+0

@minitech申し訳ありませんが、私は不明でした。まだ、1つではありません。私はそれを避けようとしていますが、既に複雑なif/elseにさらに多くのチェックを追加するより効率的ではないかと疑問に思っています。私は既存のキャプチャの前にファイルを解析し、次に新しいキャプチャのために再度解析します。新しい入力は、特殊なチェックを何度も追加することなく、既存のロジックを破ります。 –

答えて

0

パフォーマンス上の問題がある場合、条件文はディスク読み込みよりずっと安価であるため、ファイルを2度読むと最終的にパフォーマンスが低下します。

複雑な条件文では、保守性が低下し、バグの可能性が生じます。

あなたができることは、ファイルをメモリに読み込むことができます(すべての行を配列にロードするだけです)。ファイルを2回読むのにかかる時間は短くなりますが、メモリを増やすことになります。

+0

パフォーマンス上の問題ではなく、既存のロジックに問題があります。ファイルを2度読むことは超効率的ではありません。複雑な条件文には独自の問題があります。配列でできることは、ファイル全体を読み込み、開始/終了インデックスを検索し、それらをブロックとして取得します。それは既存のロジックを再加工することを意味するだろうが、とにかくそれはやらなければならないと思う。 –

関連する問題