2013-05-07 10 views
8

GNU Parallelを使用して、システムに格納されたファイルを並行して検索することができるかどうか評価しています。システム上の各年の1日に1つのファイルしか存在できません(したがって、最大366ファイル/年)。システム上に3660のファイルがあるとします(約10年間のデータ)。システムは、マルチCPUマルチコアLinuxまたはマルチCPU Solarisであってもよい。GNU Parallelに大量のコマンドを供給するには?

私は検索コマンドをファイルの配列(ファイルごとに1つのコマンド)として保存します。そして、これは私が(bashのを使用して)今やっていることですが、その後、私は(間違いなく、一度にすべての3660件の検索を開始したくない)並行して起動する方法多くの検索に制御することはできません:

#!/usr/bin/env bash 
declare -a cmds 
declare -i cmd_ctr=0 

while [[ <condition> ]]; do 
    if [[ -s $cur_archive_path/log.${doy_ctr} ]]; then 
     cmds[$cmd_ctr]="<cmd_to_run>" 
     let cmd_ctr++ 
    fi 
done 

declare -i arr_len=${#cmds[@]} 
for ((i=0; i<${arr_len}; i++)); 
do 
    # Get the command and run it in background 
    eval ${cmds[$i]} & 
done 
wait 

parallel(最大CPU /コアを自動的に把握し、並行して多くの検索を開始する)を使用する場合は、配列cmdsを並列に再利用して上記のコードを書き直すにはどうすればよいですか?他の代替は、ファイルにすべてのコマンドを記述し、その後cat cmd_file | parallel

+0

私の宇宙では、10年連続の閏年がないので、10年は3660ファイルを得ることができません。しかし、あなたが「約」と書いたので、私はあなたがそれを知っていると思って、平行な宇宙(私を少し悲しむ)から私のことを見ていないと仮定します;-) –

+0

@Adrianあなたは正しいです。私は「約」を閏年のアカウントに追加しました:) –

答えて

6

https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Using-shell-variablesを行うことであると言う:

parallel echo ::: "${V[@]}" 

あなたはとても、エコーを望んでいない:

parallel ::: "${cmds[@]}" 

をあなたは必要としない場合他のものは$ cmds、次に 'sem'(これはパラレル - セマフォーのエイリアス)を使用します。https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Working-as-mutex-and-counting-semaphore

while [[ <condition> ]]; do 
    if [[ -s $cur_archive_path/log.${doy_ctr} ]]; then 
    sem -j+0 <cmd_to_run> 
    fi 
done 
sem --wait 

あなたは何が<かもしれないと説明していません。 (https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Composed-commandsに基づく)

parallel 'if [ -s {} ] ; then cmd_to_run {}; fi' ::: $cur_archive_path/log.{1..3660} 

:あなたは、単にforループのようなものをやっている場合あなたがスクリプト全体を置き換えることができます。

+0

すべてのヒントをありがとう。しかし、cmds配列に1000個の要素/コマンドがある場合、特に "$ {cmds [@]}"がインラインで展開されているとシェルが爆発してしまうのではないでしょうか?ファイルからコマンドを入力する方が安全だと思いますか? –

+0

また、 '$ {cmds [@]}'を展開すると、複数のコマンド間の区切り文字は何ですか(各コマンドの最後に ';'を使用する必要がありますか?これは 'cat cmd_file |とどのように違うのですか?パラレル '私は新しい行の文字がコマンドセパレータと見なされると思いますか? –

+0

私は130KBのコマンドラインを実行できます。コマンドが130文字未満の場合は安全です。しかし、個人的には、単にコマンドを並列にパイプする(つまり、シェルの制限と一時ファイルの両方を避ける)か、パラレルでコマンドを生成させるだけです。 –

関連する問題