それは何ですか? 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 時間過ごすと、コマンド ラインの虜になってしまうでしょう。 準備 このチュートリアルの例に従うには、まず次の操作を行う必要があります。 最新バージョンをインストールします: (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 出力(タスクは並列で実行されるため、順序は異なる場合があります):
入力ソースとしてのファイル: 並列 -a abcファイルエコー 出力は上記と同じです。 入力ソースとしてのSTDIN(標準入力): cat abc-file | 並列エコー 出力は上記と同じです。 複数の入力ソース GNU Parallel は、コマンドラインで複数の入力ソースを指定することをサポートしており、すべての可能な組み合わせを生成します。 並列エコー ::: ABC ::: DEF 出力:
入力ソースとしての複数のファイル: 並列 -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 出力:
入力ソースの 1 つが短い場合は、その値が繰り返されます。 並列 --xapply エコー ::: ABCDE ::: FG 出力:
パラメータセパレータの変更 GNU Parallel では、::: または :::: の代わりに区切り文字を指定できます。これは、これらの 2 つのシンボルが他のコマンドによって使用されている場合に特に便利です。 並列 --arg-sep ,, echo ,, ABC :::: 定義ファイル 出力:
パラメータ区切り文字を変更するには: 並列 --arg-file-sep // echo ::: ABC // 定義ファイル 出力は上記と同じです。 パラメータ区切り文字の変更 デフォルトでは、GNU Parallel は 1 行を 1 つのパラメータとして扱い、パラメータ区切り文字として \n を使用します。 -d を使用すると次のものを変更できます: 並列 -d _ echo :::: abc_-ファイル 出力:
\0 は NULL を表します: 並列 -d '\0' エコー :::: abc0-ファイル 出力は上記と同じです。 -0 は -d '\0' の短縮形です (通常、find ... -print0 からの入力を読み取るために使用されます)。 並列 -0 エコー ::::abc0-ファイル 出力は上記と同じです。 入力ソースの終了値 GNU Parallel は、終了マークとして値を指定することをサポートしています。 並列 -E 停止エコー ::: AB 停止 CD 出力:
空行をスキップする 空行をスキップするには --no-run-if-empty を使用します。 (エコー 1; エコー; エコー 2) | 並列 --no-run-if-empty エコー 出力:
ビルドコマンドライン コマンドが指定されていないため、引数がコマンドになります。 parallel の後にコマンドが指定されていない場合、これらの引数はコマンドとして扱われます。 並列::: ls 'echo foo' pwd 出力: [現在のファイルリスト] フー [現在の作業ディレクトリへのパス] コマンドは、スクリプト ファイル、バイナリ実行ファイル、または bash 関数にすることができます (関数は export -f を使用してエクスポートする必要があります)。 # Bash でのみ動作し、$SHELL=.../bash の場合にのみ動作します my_func() { my_func $1 でエコー } エクスポート -f my_func 並列 my_func ::: 1 2 3 出力:
文字列を置換 交換用弦5種類 GNU Parallel はさまざまな置換文字列をサポートしています。デフォルトでは、{} が使用されます。 パラレルエコー ::: A/BC 出力:
特定 {}: 並列エコー {} ::: A/BC 出力は上記と同じ 拡張子 {.} を削除します: 並列エコー {.} ::: A/BC 出力
パスを削除します: 並列エコー{/}:::A/BC 出力:
パスのみを保持します。{//}: 並列エコー{//}:::A/BC 出力:
パスと拡張子を削除します。{/.}: 並列エコー{/.} ::: A/BC 出力:
出力タスク番号: 並列エコー {#} ::: A/BC 出力:
置換文字列を変更する -I を使用して置換文字列を {} に変更します。 並列 -I ,, エコー ,, ::: A/BC 出力:
--extensionreplace {.}を置き換えます: 並列 --extensionreplace ,, エコー ,, ::: A/BC 出力:
–basenamereplace は、{/} を置き換えます: 並列 --basenamereplace ,, エコー ,, ::: A/BC 出力:
--dirnamereplace 置換:{//} 並列 --dirnamereplace ,, エコー ,, ::: A/BC 出力:
–basenameextensionreplace 置換する: 並列 --basenameextensionreplace ,, エコー ,, ::: A/BC 出力:
–seqreplace は {#} を置き換えます: 並列 --seqreplace ,, エコー ,, ::: ABC 出力:
指定された位置の文字列を置換する 入力ソースが複数ある場合は、{number} を使用して特定の入力ソースのパラメータを指定できます。 並列エコー {1} と {2} ::: AB ::: CD 出力:
指定した置換文字列を変更するには、/ // /. および .: を使用できます。 並列エコー /={1//={1///.={1/.} .={1.} ::: A/BC D/EF 出力:
位置は負の数にすることができ、逆方向に数えることを示します。 並列エコー 1={1} 2={2} 3={3} -1={-1} -2={-2} -3={-3} ::: AB ::: CD ::: EF 出力:
列による入力 --colsep を使用して、入力パラメータとしてファイル内の行を列に分割します。以下ではTAB (\t) を使用します。
パラメータ名を指定 入力の各行の最初の値をパラメータ名として使用するには、--header を使用します。 並列 --header : echo f1={f1} f2={f2} ::: f1 AB ::: f2 CD 出力:
区切り文字として TAB を使用するファイルを処理するには、--colsep を使用します。 並列 --header : --colsep '\t' echo f1={f1} f2={f2} :::: tsv-file.tsv 出力:
マルチパラメータ –xargs を使用すると、GNU Parallel は 1 行あたり複数の引数 (上限あり) をサポートできるようになります。 cat num30000 | 並列 --xargs エコー | wc -l 出力:
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 出力:
より明確なビューを実現するために、10 ポイントのパラメーターが 4 つのタスクに割り当てられています。 並列 --jobs 4 -m エコー ::: {1..10} 出力:
置換文字列は単語の一部にすることができます。次の 2 つのコマンドを使用して、-m と -X の違いを体験してください。 並列 --jobs 4 -m echo pre-{}-post ::: ABCDEFG 出力:
-X は -m の反対です: 並列 --jobs 4 -X エコー pre-{}-post ::: ABCDEFG
1 行あたりのパラメータの数を制限するには -N を使用します。 並列 -N3 エコー :::ABCDEFGH 出力:
-N は文字列を置換する位置を指定するためにも使用できます。 並列 -N3 エコー 1={1} 2={2} 3={3} ::: ABCDEFGH 出力:
-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] 出力:
次のコマンドを使用することもできます: parallel perl\ -e\ \'print\ \"@ARGV\\n\"\' ::: これも動作します 出力:
スペースを削除 引数間のスペースを削除するには、--trim を使用します。 並列 --trim r echo pre-{}-post ::: ' A ' 出力:
左側のスペースを削除します。 並列 --trim l echo pre-{}-post ::: ' A ' 出力:
両側のスペースを削除します。 並列 --trim lr echo pre-{}-post ::: ' A ' 出力:
制御出力 パラメータを出力プレフィックスとして使用します: 並列 --tag echo foo-{} ::: ABC 出力:
出力プレフィックス –tagstring を変更します。 並列 --tagstring {}-bar echo foo-{} ::: ABC 出力:
以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: リクエスト数を制限するために Ajax 同時リクエストを実装するために js を使用するサンプル コード
>>: MYSQL開発パフォーマンス調査:バッチデータ挿入の最適化方法
1. 改行を強制せず、省略記号で終了します。コードをコピーコードは次のとおりです。 <div ...
目次1. 概要1. スカイウォーキング入門2. スカイウォーキング建築3. スカイウォーキングはどの...
次のような要件があります: インポート ボタン。ボタンをクリックして Excel テーブルをインポー...
コンテナ間の通信1. コンテナのネットワーク共有このモードの Docker コンテナはネットワーク ...
関連する知識ポイント親コンポーネントから子コンポーネントに値を渡す子コンポーネントから親コンポーネン...
電話Amap API を呼び出す方法は? Amap が https://lbs.amap.com/a...
この記事では、MySQL 8.0.15 winx64 圧縮パッケージのインストールと設定方法を参考ま...
1. 背景Youzan の各 OLTP データベース インスタンスには、実行時間が特定のしきい値を超...
導入RANGE パーティション分割は、指定された連続した間隔範囲に基づいています。RANGE の初期...
日常業務では、ログを表示する必要がよくあります。たとえば、 tail コマンドを使用してログをリアル...
最近、Xiao Ming は新しい Mac を購入し、独自のブログ Web サイトを構築したいと考え...
1. テーブルとパーティションを分割する必要があるのはなぜですか?日常の開発では、大きなテーブルに遭...
序文これまでの Tomcat シリーズの記事を通じて、私のブログを読んでいる学生は Tomcat に...
これに先立ち、1日かけてやってみました。Seataは使い方が簡単で超シンプルですが、インストールや設...
コードをコピーコードは次のとおりです。 <hr style="width:490px...