GNU Parallelの具体的な使用法

GNU Parallelの具体的な使用法

それは何ですか?

GNU Parallel は、1 台以上のコンピュータでコンピューティング タスクを並列に実行するためのシェル ツールです。コンピューティング タスクは、シェル コマンドまたは各行を入力とするスクリプト プログラムになります。一般的な入力は、ファイル、ホスト、ユーザー、URL、またはテーブルのリストです。計算タスクは、パイプから読み取られたコマンドである場合もあります。 GNU Parallel は入力をチャンクに分割し、パイプラインを通じて並列に実行します。

xargs コマンドと tee コマンドの使い方がわかっていれば、GNU Parallel には xargs と同じオプションがあるため、非常に簡単に使用できることがわかります。 GNU Parallel は、ほとんどのシェル ループを置き換え、並列方式で計算タスクをより高速に完了できます。

GNU Parallel は、計算タスクが順番に実行された場合と同じ出力を保証するため、GNU Parallel の出力は他のプログラムの入力として便利に使用できます。

入力の各行に対して、GNU Parallel はその行を引数として使用して指定されたコマンドを実行します。コマンドが指定されていない場合は、その行はコマンドとして実行されます。複数の入力行が並列に実行されます。 GNU Parallel は、xargs や cat | bash の代わりとしてよく使用されます。

ガイド

このチュートリアルでは、GNU Parallel の機能のほとんどを紹介します。これは、実際の使用例を示すのではなく、GNU Parallel のオプションを紹介することを目的としています。このチュートリアルに従って 1 時間過ごすと、コマンド ラインの虜になってしまうでしょう。

準備

このチュートリアルの例に従うには、まず次の操作を行う必要があります。

parallel >= version 20130814

最新バージョンをインストールします:

(wget -O - pi.dk/3 || curl pi.dk/3/) | bash

このコマンドはガイドの最新バージョンもインストールします

男並列チュートリアル

このチュートリアルのほとんどは、古いバージョンとも互換性があります。

abcファイル

メイクファイル:

並列 -k エコー ::: ABC > abc-ファイル

定義ファイル

メイクファイル:

並列 -k echo :::DEF > 定義ファイル

abc0 ファイル

メイクファイル:

perl -e 'printf "A\0B\0C\0"' > abc0-ファイル

abc_ファイル

メイクファイル:

perl -e 'printf "A_B_C_"' > abc_-ファイル

tsv_ファイル.tsv

メイクファイル:

perl -e 'printf "f1\tf2\nA\tB\nC\tD\n"' > tsv-file.tsv

30000番

メイクファイル:

perl -e 'for(1..30000){print "$_\n"}' > num30000

1000000番

メイクファイル:

perl -e 'for(1..1000000){print "$_\n"}' > num1000000

num_%ヘッダー

メイクファイル:

(echo %head1; echo %head2; perl -e 'for(1..10){print "$_\n"}') > num_%header

リモート実行: $SERVER1 および $SERVER2 への ssh パスワードなしログイン

メイクファイル:

サーバー1 = server.example.com
サーバー2 = server2.example.net

最後に、次のコマンドが正常に実行されるはずです。

ssh $SERVER1 echoは動作する
ssh $SERVER2 echoは動作する

ssh-keygen -t dsa; ssh-copy-id $SERVER1 を使用して環境を作成します (空のパスフレーズを使用)

入力ソース

GNU Parallel の入力ソースは、ファイル、コマンドライン、標準入力 (stdin またはパイプ) をサポートします。

単一入力ソース

コマンドラインから入力を読み取ります。

並列エコー ::: ABC

出力(タスクは並列で実行されるため、順序は異なる場合があります):


B

入力ソースとしてのファイル:

並列 -a abcファイルエコー

出力は上記と同じです。

入力ソースとしてのSTDIN(標準入力):

cat abc-file | 並列エコー

出力は上記と同じです。

複数の入力ソース

GNU Parallel は、コマンドラインで複数の入力ソースを指定することをサポートしており、すべての可能な組み合わせを生成します。

並列エコー ::: ABC ::: DEF

出力:

広告
AE
AF
BD
なれ
ボーイフレンド
CD
CE
CF

入力ソースとしての複数のファイル:

並列 -a abcファイル -a defファイル echo

出力は上記と同じです。

STDIN (標準入力) は、「-」を使用して入力ソースの 1 つとして使用できます。

cat abc-file | parallel -a - -a def-file echo

出力は上記と同じです。

-a の代わりに「::::」を使用できます。

cat abc-file | 並列 echo :::: - def-file

出力は上記と同じです。

::: と :::: は混在できます:

並列エコー ::: ABC :::: def-file

出力は上記と同じです。

適応パラメータ

–xapply は各入力ソースから 1 つの引数を受け取ります。

並列 --xapply エコー :::ABC :::DEF

出力:

広告
なれ
CF

入力ソースの 1 つが短い場合は、その値が繰り返されます。

並列 --xapply エコー ::: ABCDE ::: FG

出力:

AF
BG
CF
総裁
EF

パラメータセパレータの変更

GNU Parallel では、::: または :::: の代わりに区切り文字を指定できます。これは、これらの 2 つのシンボルが他のコマンドによって使用されている場合に特に便利です。

並列 --arg-sep ,, echo ,, ABC :::: 定義ファイル

出力:

広告
AE
AF
BD
なれ
ボーイフレンド
CD
CE
CF

パラメータ区切り文字を変更するには:

並列 --arg-file-sep // echo ::: ABC // 定義ファイル

出力は上記と同じです。

パラメータ区切り文字の変更

デフォルトでは、GNU Parallel は 1 行を 1 つのパラメータとして扱い、パラメータ区切り文字として \n を使用します。 -d を使用すると次のものを変更できます:

並列 -d _ echo :::: abc_-ファイル

出力:


B

\0 は NULL を表します:

並列 -d '\0' エコー :::: abc0-ファイル

出力は上記と同じです。

-0 は -d '\0' の短縮形です (通常、find ... -print0 からの入力を読み取るために使用されます)。

並列 -0 エコー ::::abc0-ファイル

出力は上記と同じです。

入力ソースの終了値

GNU Parallel は、終了マークとして値を指定することをサポートしています。

並列 -E 停止エコー ::: AB 停止 CD

出力:


B

空行をスキップする

空行をスキップするには --no-run-if-empty を使用します。

(エコー 1; エコー; エコー 2) | 並列 --no-run-if-empty エコー

出力:

1
2

ビルドコマンドライン

コマンドが指定されていないため、引数がコマンドになります。

parallel の後にコマンドが指定されていない場合、これらの引数はコマンドとして扱われます。

並列::: ls 'echo foo' pwd

出力:

[現在のファイルリスト]
フー
[現在の作業ディレクトリへのパス]

コマンドは、スクリプト ファイル、バイナリ実行ファイル、または bash 関数にすることができます (関数は export -f を使用してエクスポートする必要があります)。

# Bash でのみ動作し、$SHELL=.../bash の場合にのみ動作します
my_func() {
 my_func $1 でエコー
}
エクスポート -f my_func
並列 my_func ::: 1 2 3

出力:

my_func 1 内
my_func 2 で
my_func 3 で

文字列を置換

交換用弦5種類

GNU Parallel はさまざまな置換文字列をサポートしています。デフォルトでは、{} が使用されます。

パラレルエコー ::: A/BC

出力:

A/BC

特定 {}:

並列エコー {} ::: A/BC

出力は上記と同じ

拡張子 {.} を削除します:

並列エコー {.} ::: A/BC

出力

AB型

パスを削除します:

並列エコー{/}:::A/BC

出力:

紀元前

パスのみを保持します。{//}:

並列エコー{//}:::A/BC

出力:


パスと拡張子を削除します。{/.}:

並列エコー{/.} ::: A/BC

出力:

B

出力タスク番号:

並列エコー {#} ::: A/BC

出力:

1
2
3

置換文字列を変更する

-I を使用して置換文字列を {} に変更します。

並列 -I ,, エコー ,, ::: A/BC

出力:

A/BC

--extensionreplace {.}を置き換えます:

並列 --extensionreplace ,, エコー ,, ::: A/BC

出力:

AB型

–basenamereplace は、{/} を置き換えます:

並列 --basenamereplace ,, エコー ,, ::: A/BC

出力:

紀元前

--dirnamereplace 置換:{//}

並列 --dirnamereplace ,, エコー ,, ::: A/BC

出力:


–basenameextensionreplace 置換する:

並列 --basenameextensionreplace ,, エコー ,, ::: A/BC

出力:

B

–seqreplace は {#} を置き換えます:

並列 --seqreplace ,, エコー ,, ::: ABC

出力:

1
2
3

指定された位置の文字列を置換する

入力ソースが複数ある場合は、{number} を使用して特定の入力ソースのパラメータを指定できます。

並列エコー {1} と {2} ::: AB ::: CD

出力:

AとC
AとD
BとC
BとD

指定した置換文字列を変更するには、/ // /. および .: を使用できます。

並列エコー /={1//={1///.={1/.} .={1.} ::: A/BC D/EF

出力:

/=BC //=A /.=B .=A/B
/=EF //=D /.=E .=D/E

位置は負の数にすることができ、逆方向に数えることを示します。

並列エコー 1={1} 2={2} 3={3} -1={-1} -2={-2} -3={-3} ::: AB ::: CD ::: EF

出力:

1=A 2=C 3=E -1=E -2=C -3=A
1=A 2=C 3=F -1=F -2=C -3=A
1=A 2=D 3=E -1=E -2=D -3=A
1=A 2=D 3=F -1=F -2=D -3=A
1=B 2=C 3=E -1=E -2=C -3=B
1=B 2=C 3=F -1=F -2=C -3=B
1=B 2=D 3=E -1=E -2=D -3=B
1=B 2=D 3=F -1=F -2=D -3=B

列による入力

--colsep を使用して、入力パラメータとしてファイル内の行を列に分割します。以下ではTAB (\t) を使用します。

1=f1 2=f2
1=A 2=B
1=C 2=D

パラメータ名を指定

入力の各行の最初の値をパラメータ名として使用するには、--header を使用します。

並列 --header : echo f1={f1} f2={f2} ::: f1 AB ::: f2 CD

出力:

f1=A f2=C
f1=A f2=D
f1 = B f2 = C
f1 = B f2 = D

区切り文字として TAB を使用するファイルを処理するには、--colsep を使用します。

並列 --header : --colsep '\t' echo f1={f1} f2={f2} :::: tsv-file.tsv

出力:

f1=A f2=B
f1=C f2=D

マルチパラメータ

–xargs を使用すると、GNU Parallel は 1 行あたり複数の引数 (上限あり) をサポートできるようになります。

cat num30000 | 並列 --xargs エコー | wc -l

出力:

2

30,000 個のパラメータは 2 行に分割されます。

1 行のパラメータ数の上限は -s で指定します。以下は、最大長が 10000 で、17 行に分割されることを指定します。

cat num30000 | 並列 --xargs -s 10000 エコー | wc -l

より優れた並行性を実現するために、GNU Parallel はファイルの読み取りが完了した後にパラメータを配布します。

GNU Parallel は最後のパラメータを読み取った後にのみ 2 番目のタスクを開始し、その時点ですべてのパラメータを 4 つのタスクに均等に分配します (4 つのタスクが指定されている場合)。

最初のタスクは、–xargs を使用した上記の例と同じですが、2 番目のタスクは 4 つのタスクに均等に分割され、合計 5 つのタスクになります。

cat num30000 | 並列 --jobs 4 -m エコー | wc -l

出力:

5

より明確なビューを実現するために、10 ポイントのパラメーターが 4 つのタスクに割り当てられています。

並列 --jobs 4 -m エコー ::: {1..10}

出力:

1 2 3
4 5 6
7 8 9
10

置換文字列は単語の一部にすることができます。次の 2 つのコマンドを使用して、-m と -X の違いを体験してください。

並列 --jobs 4 -m echo pre-{}-post ::: ABCDEFG

出力:

A前 B後
C前 D後
E前 F後
G前-G後

-X は -m の反対です:

並列 --jobs 4 -X エコー pre-{}-post ::: ABCDEFG


出力:

前A後前B後
前C後前D後
プレEポスト プレFポスト
G前-G後

1 行あたりのパラメータの数を制限するには -N を使用します。

並列 -N3 エコー :::ABCDEFGH

出力:

ABC
防御力
GH

-N は文字列を置換する位置を指定するためにも使用できます。

並列 -N3 エコー 1={1} 2={2} 3={3} ::: ABCDEFGH

出力:

1=A 2=B 3=C
1=D 2=E 3=F
1=G 2=H 3=

-N0 は引数を 1 つだけ読み取りますが、追加は行いません。

並列 -N0 エコー foo ::: 1 2 3

出力:

フー
フー
フー

参考文献

コマンドラインに特殊文字が含まれている場合は、引用符で保護する必要があります。

Perl スクリプト 'print "@ARGV\n"' は Linux の echo と同じことを行います。

perl -e 'print "@ARGV\n"' A

出力:


GNU Parallel を使用してこのコマンドを実行する場合、perl コマンドを引用符で囲む必要があります。

parallel perl -e 'print "@ARGV\n"' ::: これは動作しません

出力:

[何もない]

perl コマンドを保護するには -q を使用します。

parallel -q perl -e 'print "@ARGV\n"' ::: これは動作します

出力:

これ
作品

': も使用できます。

parallel perl -e \''print "@ARGV\n"'\' ::: これも動作します

出力:

これ
作品、
あまりにも

-quote の使用:

並列 --shellquote
parallel: 警告: 入力は端末から読み取られます。これを意図的に行うのは熟練者​​だけです。終了するには CTRL-D を押してください。
perl -e '"@ARGV\n" を印刷'
[Ctrl+D]

出力:

perl\ -e\ \'print\ \"@ARGV\\n\"\'

次のコマンドを使用することもできます:

parallel perl\ -e\ \'print\ \"@ARGV\\n\"\' ::: これも動作します

出力:

これ
また
作品

スペースを削除

引数間のスペースを削除するには、--trim を使用します。

並列 --trim r echo pre-{}-post ::: ' A '

出力:

前 A 後

左側のスペースを削除します。

並列 --trim l echo pre-{}-post ::: ' A '

出力:

プレAポスト

両側のスペースを削除します。

並列 --trim lr echo pre-{}-post ::: ' A '

出力:

プレAポスト

制御出力

パラメータを出力プレフィックスとして使用します:

並列 --tag echo foo-{} ::: ABC

出力:

フーア
B フーB
C フー-C

出力プレフィックス –tagstring を変更します。

並列 --tagstring {}-bar echo foo-{} ::: ABC

出力:

Aバー フーA

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • GNU Parallelの具体的な使用法
  • マルチコア CPU を使用して Linux コマンドを高速化する方法 (GNU Parallel)
  • 15 分で学べる並列アーティファクト GNU Parallel 入門ガイド

<<:  リクエスト数を制限するために Ajax 同時リクエストを実装するために js を使用するサンプル コード

>>:  MYSQL開発パフォーマンス調査:バッチデータ挿入の最適化方法

推薦する

MySQL CHARとVARCHARの保存と読み取りの違い

導入保存時と読み取り時に CHAR 型と VARCHAR 型の違いを本当にご存知ですか?まずいくつか...

Js でオブジェクトのディープ オブジェクトを安全に取得するメソッドの例

目次序文文章パラメータ例Lodash 実装:トーキー機能: castPath関数: stringTo...

自動ロック画面機能を実現するjs

1. 使用シナリオこのような要件があるため、システムが開発されました。ユーザーがデスクトップを離れ...

MySQL における SQL ページングクエリのいくつかの実装方法と利点と欠点

【SQL】SQLページングクエリの概要開発プロセスではページングが必要になることがよくあります。今日...

Alibaba Cloud Centos6.X でメールを送信する際に発生するさまざまな問題

序文: Webサービスを提供するために、Alibabaクラウドホストを新しくインストールしました。す...

CSS3+JavaScript を使用したクールな呼吸効果のサンプル コード

CSS3 アニメーションで実現したシンプルでクールな効果。最終的な効果は次のようになります。 ページ...

HTML タグの表示モード (ブロックレベル タグ、インライン タグ、インライン ブロック タグ) に関する簡単な説明

今日の講義では、HTML におけるタグの表示モードについてお話ししましたが、これはブロックレベルタグ...

ログインインターフェースの使いやすさとセキュリティのバランスをとる方法

ウェブデザイナーでもUIデザイナーでも、ログインページや登録ページのデザインは必ず経験しなければなら...

州と市町村の連携を簡単に実現するJavaScript

この記事では、省と市の簡単な連携を実現するためのJavaScriptの具体的なコードを参考までに紹介...

Linux viコマンドの知識ポイントと使い方のまとめ

Linux viコマンドの詳しい説明vi エディタは、すべての Unix および Linux システ...

Vue-CLI3.xはプロジェクトをサーバーに自動的にデプロイします

目次序文1. scp2をインストールする2. テスト/本番環境サーバーのSSHリモートログインアカウ...

MySQL ステートメントにおける IN と Exists の比較分析

背景最近、SQL 文を書くときに、IN と Exists のどちらを選択するか迷ったので、両方の方法...

MySQL でインデックス構造として B+ ツリーを使用する利点は何ですか?

序文MySQL では、Innodb と MyIsam の両方がインデックス構造として B+ ツリーを...

純粋な CSS でカスタムラジオボタンとチェックボックス機能を実装する

1. 効果を達成する 2 知識ポイント2.1 <label> タグHTML では、<...

Zabbix は MySQL インスタンス メソッドを監視します

1. 監視計画監視項目を作成する前に、何を監視するのか、どのように監視するのか、監視データをどのよう...