サーチ…
前書き
GNU Linuxのジョブは、GNU並列を使用して並列化することができます。ジョブは、入力内の各行に対して実行する必要のある単一のコマンドまたは小さなスクリプトにすることができます。典型的な入力は、ファイルのリスト、ホストのリスト、ユーザーのリスト、URLのリスト、またはテーブルのリストです。ジョブは、パイプから読み取るコマンドでもあります。
構文
- パラレル[options] [command [arguments]] <list_of_arguments>
パラメーター
オプション | 説明 |
---|---|
-jn | 並行してn個のジョブを実行する |
-k | 同じ順序を保つ |
-X | コンテキスト置換による複数引数 |
--colsep regexp | 位置の置き換えのために正規表現で入力を分割する |
{} {.} {/} {/.} {#} | 置換文字列 |
{3} {3.} {3/} {3/.} | 位置置換文字列 |
-S sshlogin | Example: [email protected] |
--trc {}.bar | --transferの短縮形--return {} .bar --cleanup |
--onall | すべてのsshloginsで引数を指定してコマンドを実行する |
--nonall | すべてのsshloginで引数なしで指定のコマンドを実行する |
--pipe | stdin(標準入力)を複数のジョブに分割します。 |
--recend str | --pipeの終了区切り文字を記録します。 |
--recstart str | --pipeの記録開始区切り文字。 |
ファイルリストの繰り返しタスクを並列化する
コンピュータのリソース(CPUやRAMなど)をより多く活用すると、多くの反復ジョブを効率的に実行できます。以下は、複数のジョブを並行して実行する例です。
あなたが< list of files >
を持っているとしましょう。たとえば、 ls
出力です。また、これらのファイルをbz2圧縮し、次のタスクの順序を操作する必要があります。
-
bzcat
を使用してbz2ファイルをstdoutに解凍する -
grep <some key word>
を使用して、特定のキーワードを含む行をグレープ(例:フィルタ) - パイプ出力は使用して1つのgzipで圧縮されたファイルに連結する
gzip
whileループを使ってこれを実行すると、次のようになります
filenames="file_list.txt"
while read -r line
do
name="$line"
## grab lines with puppies in them
bzcat $line | grep puppies | gzip >> output.gz
done < "$filenames"
GNU Parallelを使うことで、3つの並列ジョブを同時に実行することができます。
parallel -j 3 "bzcat {} | grep puppies" ::: $( cat filelist.txt ) | gzip > output.gz
このコマンドは、ファイル数とファイルサイズが大きい場合に、簡潔で簡潔で効率的です。ジョブはparallel
で起動され、オプション-j 3
は3つの並列ジョブを起動し、並列ジョブへの入力は:::
取り込まれます。出力は最終的にgzip > output.gz
パイプされgzip > output.gz
STDINを並列化する
さて、変換する必要がある1つの大きなファイル(たとえば30 GB)が1行ずつあるとしましょう。この<task>
するスクリプトconvert.sh
があるとし<task>
。我々は、このファイルのパイプの内容がで取るために、並列のためにstdinとのような塊で作業することができます
<stdin> | parallel --pipe --block <block size> -k <task> > output.txt
<stdin>
はcat <file>
ようなものから始まりcat <file>
。
再現可能な例として、私たちのタスクはnl -n rz
ます。任意のファイルをdata.bz2
、私の場合はdata.bz2
、それを<stdin>
bzcat data.bz2 | nl | parallel --pipe --block 10M -k nl -n rz | gzip > ouptput.gz
上記の例では、 bzcat data.bz2 | nl
から<stdin>
をbzcat data.bz2 | nl
には、最終出力output.gz
が受信された順番で保存されるという概念の証明としてnl
含まれています。次いで、 parallel
分割<stdin>
サイズ10メガバイトのチャンクに、各チャンクのがを通してそれを通過nl -n rz
それだけ正しく詰め番号(参照追加nl --help
詳細については)。オプション--pipe
伝えparallel
分割するために<stdin>
複数のジョブにと-- block
ブロックのサイズを指定します。オプション-k
は、順序付けを維持する必要があることを指定します。
最終的な出力は次のようになります
000001 1 <data>
000002 2 <data>
000003 3 <data>
000004 4 <data>
000005 5 <data>
...
000587 552409 <data>
000588 552410 <data>
000589 552411 <data>
000590 552412 <data>
000591 552413 <data>
私の元のファイルは552,413行でした。最初の列は並列ジョブを表し、2番目の列はチャンクでparallel
に渡された元の行番号を表します。 2番目の列(およびファイルの残りの部分)の順序が維持されていることに注意してください。