1

コマンドラインツールで本当に奇妙な問題に遭遇しました。基本的に、私は一致する単語を検索し、ファイルからテキストを取得しようとしていました。だから私は80,000語のfile1を持っています:

aaa
bbb
ccc
ddd
...

そして、600,000行のテキストを含むfile2があります。

id: hhh, address: xxxx, content: yyyy
id: aaa, address: zzzz, content: eeee
id: jjj, address: qqqq, content: oooo
id: ccc, address: nnnn, content: tttt
...

file1の単語を含むfile2のテキストを見つける必要があるため、出力は次のようになります。

id: aaa, address: zzzz, content: eeee
id: ccc, address: nnnn, content: tttt
...

今、私はコマンドを使用してcat file2 | grep -f file1 > newfile.いました。メソッドもテストしましたが、非常にうまく機能し、実行速度に問題はありません。しかし、その実際のファイルでこのコマンドを実行すると、非常に遅くなりました...これまで12時間実行されていて、ターミナルのコマンドはまだ実行されています!新しいファイルをチェックインしたとき、生成されたテキストは2000行だけです。つまり、80,000行の結果全体を取得する必要がある場合、12時間の40回が必要です。これは絶対にばかげています。

また、600,000行のテキストであるfile2で実験を試みました。のようなコマンドを実行するとcat file2 | grep -w 'aaa'、すぐに1秒未満で結果が得られます。また、いくつかの単語を含むファイルで試してみましたが、すぐに取得されます。だから私は理解していません、なぜそれが80,000語に永遠にかかったのか。すべての単語を検索するのに1秒かかるとしても、それでも20時間未満しかかかりません。これは、私が出会った現在のケースよりもはるかに高速です...誰かが私にヒントを教えてもらえますか?

4

1 に答える 1

3

600,000行のそれぞれで80,000行のそれぞれを検索するためのコードは、料金がかかります。

  • 無条件の変更:使用grep -f file1 file2(no cat)。おそらくパフォーマンスはわずかに向上しますが、大きなファイルを1回コピーする手間が省けます。
  • -F可能性:ワイルドカード検索を抑制するために追加します。これにより、実際には単純な検索であるコンパイル済み正規表現の80,000コピーを回避できます。

    grep -F -f file1 file2
    
  • GNU-wのと-xオプションを検索しますgrep。それらは検索を単純化するかもしれません。
  • ワークロードを分割します。80,000行のファイルをそれぞれ1000行の80ファイルに分割します。コマンドを80回実行します。

最後の選択肢は、「絶望の助言」のようなものです。他のオプションで速度が上がらない場合は、パフォーマンスが正常に近づく可能性があります(少なくとも、検索された行の各セットの時間を計って、実行時間の目安を得ることができます)。

于 2013-03-27T10:12:25.337 に答える