2

問題文:-

String Patternは周りの特定のものを検索10000 filesし、それを含むファイル内のレコードを見つける必要がありますparticular pattern。ここでも使えgrepますが、時間がかかります。

particular string pattern以下は、私が後を検索するために使用しているコマンドunzippingですdat.gz file

gzcat /data/newfolder/real-time-newdata/*_20120809_0_*.gz | grep 'b295ed051380a47a2f65fb75ff0d7aa7^]3^]-1'

上記を解凍した後、ファイルがいくつあるかを単純に数えるとdat.gz file

gzcat /data/newfolder/real-time-newdata/*_20120809_0_*.gz | wc -l

私は回り10000 filesます。そして、これらすべてで上記の文字列パターンを検索し、上記10000 filesを含むレコードを見つける必要がありますString Pattern。上記のコマンドは正常に機能していますが、非常に低速です。

これに対する最善のアプローチは何ですか?一度に取得100 filesして、その中の特定の文字列パターンを検索する必要があり100 files parallellyます。

ノート:

私はSunOSを実行しています

bash-3.00$ uname -a
SunOS lvsaishdc3in0001 5.10 Generic_142901-02 i86pc i386 i86pc
4

4 に答える 4

2

これを並行して実行しないでください!!!! それはディスクヘッドをあちこちにバウンスさせるでしょう、それははるかに遅くなります。

アーカイブファイルを読み取っているので、パフォーマンスを大幅に向上させる1つの方法があります。解凍の結果を書き出さないでください。理想的な答えは、メモリ内のストリームに解凍することです。それが実行可能でない場合は、RAMディスクに解凍します。

いずれにせよ、ここである程度の並列処理が必要です。あるスレッドがデータを取得してから、検索を行う別のスレッドにデータを渡す必要があります。そうすれば、ディスクまたはコアで解凍を行うのを待つことになり、検索を行うのにその時間を無駄にすることはありません。

(RAMディスクの場合は、書き込みたファイルを積極的に読み取り、RAMディスクがいっぱいにならないようにそれらを強制終了する必要があることに注意してください。)

于 2012-08-16T00:10:09.690 に答える
0

手始めに、ファイルをディスクに解凍する必要があります。

これは(bashで)機能しますが、10,000個のプロセスを一度に開始しようとは思わないでしょう。非圧縮ディレクトリ内で実行します。

for i in `find . -type f`; do ((grep 'b295ed051380a47a2f65fb75ff0d7aa7^]3^]-1' $i )&); done

したがって、生成されるプロセスの数を制限する方法が必要です。これは、マシンで実行されているgrepプロセスの数が10(カウントを実行しているプロセスを含む)を超えている限りループします。

while [ `top -b -n1 | grep -c grep` -gt 10  ]; do echo true; done

私はこれを実行しました、そしてそれは動作します....しかし、topは実行するのに非常に時間がかかるので、事実上1秒あたり1grepに制限されます。誰かがこれを改善して、新しいプロセスが開始されたときにカウントに1を追加し、プロセスが終了したときに1ずつデクリメントすることができますか?

for i in `find . -type f`; do ((grep -l 'blah' $i)&); (while [ `top -b -n1 | grep -c grep` -gt 10 ]; do sleep 1; done); done

いつ寝るか、いつ寝ないかを決める方法について他に何かアイデアはありますか?部分的な解決策については申し訳ありませんが、誰かがあなたが必要とする他のビットを持っていることを願っています。

于 2012-08-16T00:08:29.043 に答える
0

正規表現を使用していない場合は、grepの-Fオプションを使用するか、fgrepを使用できます。これにより、パフォーマンスが向上する場合があります。

于 2012-08-16T20:21:54.633 に答える
0

は10000gzcat .... | wc -lファイルを示しているのではなく、ファイルがいくつあっても合計10000行を示しています。

これは、に存在するタイプの問題xargsです。のバージョンに(または単に)gzipというスクリプトが付属していると仮定すると、次のように実行できます。gzgrepzgrep

find /data/newfolder/real-time-newdata -type f -name "*_20120809_0_*.gz" -print | xargs gzgrep

gzgrepこれにより、コマンドラインに収まる限り多くの個別ファイルのバッチを使用して1つのコマンドが実行されます(数を制限するオプションxargsや、その他の数を制限するオプションがあります)。残念ながら、gzgrepそれでも各ファイルを解凍してに渡す必要grepがありますが、検索するためにコーパス全体を解凍する必要がないようにするための良い方法はありません。ただし、このように使用xargsすると、生成する必要のある新しいプロセスの総数がいくらか削減されます。

于 2012-08-16T20:45:22.363 に答える