サーチ…


前書き

GNU Linuxのジョブは、GNU並列を使用して並列化することができます。ジョブは、入力内の各行に対して実行する必要のある単一のコマンドまたは小さなスクリプトにすることができます。典型的な入力は、ファイルのリスト、ホストのリスト、ユーザーのリスト、URLのリスト、またはテーブルのリストです。ジョブは、パイプから読み取るコマンドでもあります。

構文

  1. パラレル[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圧縮し、次のタスクの順序を操作する必要があります。

  1. bzcatを使用してbz2ファイルをstdoutに解凍する
  2. grep <some key word>を使用して、特定のキーワードを含む行をグレープ(例:フィルタ)
  3. パイプ出力は使用して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番目の列(およびファイルの残りの部分)の順序が維持されていることに注意してください。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow