awkを並列で使用する

awkを並列で使用する

それぞれ 300 MB のファイルが約 3,000 個あり、16 コアのサーバーを使用して、一連の部分文字列をできるだけ早く検索したいと考えています。

これは私が試したことですが、ファイルの検索を並列化していないようです。

sudo find /mnt2/preprocessed/preprocessed/mo* | sudo xargs awk '/substring/ {c++} END {print c}' | paste -sd+ | bc

さまざまなハウツーから貼り付けられているため、完全に理解できません。ファイル処理を分割する方法について何か提案はありますか?

答え1

  1. システムにプログラムがあるかどうか確認してくださいparallel。(GNU から来ている可能性があります。) ある場合は、その使い方を調べてください。そうでない場合は、
  2. を実行して、出力をファイルに書き込みますfind。テキスト エディター、または などのツールを使用したスクリプトを使用してhead、そのファイルを (ほぼ) 同じ数の行 (つまり、見つかったファイルと同じ数を参照) を持つ 16 個のフラグメント ファイルに分割します。次に、awk … | paste … | bcフラグメント ファイルごとに 1 つずつ、合計 16 個のパイプラインを開始します (そして、16 個の結果を追加します)。

awkは文字列の出現回数をカウントするためにgrep -c特別に設計されているのに、なぜ を使用しているのか疑問に思います。

答え2

GNU parallelはxargsとかなり互換性があるので、あなたの場合はそれを置き換えることができます。useの出現回数を次のようにカウントするだけsubstringならgrep -cスコット提案:

sudo find /mnt2/preprocessed/preprocessed/mo* | 
  sudo parallel grep -c source | paste -sd+ | bc

GNU/Linux の一部のバージョンでは、GNU parallel が「Tollef の parallel」互換モードでインストールされることに注意してください。parallel のコマンド ライン引数を追加することで、これを変更できます--gnu。変更を永続的にするには、 を追加し--gnuます~/.parallel/config

関連情報