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開発パフォーマンス調査:バッチデータ挿入の最適化方法

推薦する

HTML の div、td、p およびその他のコンテナーでの強制改行と非改行の実装

1. 改行を強制せず、省略記号で終了します。コードをコピーコードは次のとおりです。 <div ...

docker を使用して Spring Boot をデプロイし、Skywalking に接続する方法

目次1. 概要1. スカイウォーキング入門2. スカイウォーキング建築3. スカイウォーキングはどの...

VueはExcelテーブルをインポートし、インポートに失敗したデータを自動的にダウンロードします。

次のような要件があります: インポート ボタン。ボタンをクリックして Excel テーブルをインポー...

Dockerコンテナ間の通信と外部ネットワーク通信の操作

コンテナ間の通信1. コンテナのネットワーク共有このモードの Docker コンテナはネットワーク ...

Vue コンポーネント化の一般的な方法: コンポーネント値の転送と通信

関連する知識ポイント親コンポーネントから子コンポーネントに値を渡す子コンポーネントから親コンポーネン...

WeChatアプレットAmapマルチポイントルート計画プロセス例の詳細な説明

電話Amap API を呼び出す方法は? Amap が https://lbs.amap.com/a...

MySQL 8.0.15 winx64 圧縮パッケージのインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 8.0.15 winx64 圧縮パッケージのインストールと設定方法を参考ま...

MySQL 最適化のケーススタディ

1. 背景Youzan の各 OLTP データベース インスタンスには、実行時間が特定のしきい値を超...

MySQL 5.5 で範囲パーティションを追加および削除する例

導入RANGE パーティション分割は、指定された連続した間隔範囲に基づいています。RANGE の初期...

Linux ログ内のキーワードとその前後の情報を検索する方法の例

日常業務では、ログを表示する必要がよくあります。たとえば、 tail コマンドを使用してログをリアル...

MacにHomebrewをインストールする際の注意点

最近、Xiao Ming は新しい Mac を購入し、独自のブログ Web サイトを構築したいと考え...

テーブルパーティションとパーティション分割とは何ですか?MySqlデータベースパーティションとテーブルパーティション分割方法

1. テーブルとパーティションを分割する必要があるのはなぜですか?日常の開発では、大きなテーブルに遭...

Tomcat が非同期サーブレットを実装する方法の詳細な説明

序文これまでの Tomcat シリーズの記事を通じて、私のブログを読んでいる学生は Tomcat に...

Docker+nacos+seata1.3.0 のインストールと使用設定チュートリアル

これに先立ち、1日かけてやってみました。Seataは使い方が簡単で超シンプルですが、インストールや設...

hr 水平線スタイルの例コード

コードをコピーコードは次のとおりです。 <hr style="width:490px...