
それぞれ 300 MB のファイルが約 3,000 個あり、16 コアのサーバーを使用して、一連の部分文字列をできるだけ早く検索したいと考えています。
これは私が試したことですが、ファイルの検索を並列化していないようです。
sudo find /mnt2/preprocessed/preprocessed/mo* | sudo xargs awk '/substring/ {c++} END {print c}' | paste -sd+ | bc
さまざまなハウツーから貼り付けられているため、完全に理解できません。ファイル処理を分割する方法について何か提案はありますか?
答え1
- システムにプログラムがあるかどうか確認してください
parallel
。(GNU から来ている可能性があります。) ある場合は、その使い方を調べてください。そうでない場合は、 - を実行して、出力をファイルに書き込みます
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
。