15 分で学べる並列アーティファクト GNU Parallel 入門ガイド

15 分で学べる並列アーティファクト GNU Parallel 入門ガイド

GNU Parallel は、1 台以上のコンピューター上で計算タスクを並列に実行するためのシェル ツールです。この記事では、GNU Parallel の使用方法について簡単に紹介します。

このCPUはマルチコアです。

一般的に、2 つのコアは次のように動作します。

クアッドコアは次のように動作します。

16 個のコアの動作は次のとおりです。

よし、もう暗くない。インテルを批判し続けるなら、私は殴られることになるだろう。

ある週末の朝、退屈していたので、半日かけて gnu parallel のマニュアル ページとチュートリアルを読みました。ハハハ、この半日は費やす価値があったと言わざるを得ません。将来的には半日以上を節約できると思うからです。

この記事は、gnu parallel のマニュアル ページまたはチュートリアルを翻訳しようとするものではありません。既製の翻訳があるので、こちらまたはこちらでご覧いただけます。

しかし、奇妙な ::: と奇妙な {}{#}{.}{\} プレースホルダーが並列に並んでいるのを何度か見た後、私はやめました。このような醜い構文は魅力的ではありません。幸いなことに、私は落ち着くためにいくつかの例を見て、自分で試してみると、それが本当に魔法のツールであることがわかりました。

この記事の主な目的は、このツールを使用するように誘導し、なぜそれを使用するのか、どのように使用するのかを説明することです。

なぜ

gnu parallel を使用する目的はただ 1 つ、つまり高速化することです。

迅速なインストール

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

作者によるとインストールには10秒かかるとのこと。国内の実情は十分ではないかもしれない。しかし、それほど時間はかかりません。実際、これは 10,000 行を超える単一ファイルの Perl スクリプトです (はい、お読みのとおり、すべてのモジュールがこのファイルに含まれています。これが特徴なのです~)。その後、ファブリック スクリプトを作成し、各ノード マシンに直接コピーしました。次に、実行権限を chmod します。
次に、システムの複数のコアを使用してプログラムを並列に実行する高速実行があります。
その上:

1G のログを grep します。

並列を使用し、並列なしで直接 grep します。結果は明らかで、20倍の差があります。これは、ack または ag 最適化を使用するよりもはるかに効果的です。

注: これは 48 コア サーバーで実行した結果です。

どうやって

最も簡単な方法は xargs を使用することです。 xargs には、複数のコアを活用できるパラメータ -P があります。

例えば:

$ 時間エコー {1..5} |xargs -n 1 スリープ

実数 0分15秒005
ユーザー 0分0.000秒
システム 0分0.000秒

この xargs の行は、各エコー番号をパラメーターとして sleep に渡すため、合計スリープ時間は 1+2+3+4+5=15 秒になります。

-P パラメータを使用してデータを 5 つのコアに割り当てると、各コアは 1、2、3、4、5 秒間スリープするため、実行後の合計スリープ時間は 5 秒になります。

$ 時間エコー {1..5} |xargs -n 1 -P 5 スリープ

実数 0分5秒003
ユーザー 0分0.000秒
システム 0分0.000秒

準備は終わりました。一般的に、並列の最初のモードは xargs -P を置き換えることです。

たとえば、すべての HTML ファイルを圧縮します。

find . -name '*.html' | 並列 gzip --best

パラメータ転送モード

最初のモードは、並列パラメータ渡しを使用することです。パイプラインの先頭から入ってくるコマンドは、後続のコマンドにパラメータとして渡され、並列に実行されます。

例えば

huang$ seq 5 | 並列エコー pre_placeholder_{}
プレプレースホルダー1
プレプレースホルダー2
プレプレースホルダー3
プレプレースホルダー4
プレプレースホルダー5

{} は、入力パラメータを保持するために使用されるプレースホルダーです。

クラウドコンピューティングの運用では、10 個のクラウド ハードディスクを作成するなどのバッチ操作が頻繁に実行されます。

seq 10 | 並列 cinder 作成 10 --display-name test_{}

50のクラウドホストを作成する

次のようにコードをコピーします
seq 50 | 並列 nova boot --image image_id --flavor 1 --availability-zone az_id --nic vnetwork=private --vnc-password 000000 vm-test_{}

クラウドホストを一括削除する

nova list | grep some_pattern | awk '{print $2}' | parallel nova delete

forループを書き直す

ご覧のとおり、実際にループを記述する必要がある多くの箇所を並列に置き換え、並列化によってもたらされる利便性を享受しました。
その理由は、 for ループを実行する場合、ループ内に配置されたオブジェクトはコンテキストに依存しないため、並列化される可能性が最も高いためです。

ユニバーサル抽象化、シェルループ:

 (`cat list`内のxに対して;
 何かをする $x
 完了) | process_output

直接書き込むことができる

 cat リスト | 並列 do_something | プロセス出力

ループ内のコンテンツが多すぎる場合

 (`cat list`内のxに対して、
 何かをする $x
 [... $x で何かを行う 100 行 ...]
 完了) | process_output

スクリプトを書いた方が良い

 行う() {
 x = $1
 何かをする $x
 [... $x で何かを行う 100 行 ...]
 }
 エクスポート -f 実行
 猫リスト | パラレルドイト

また、多くの面倒な脱出を回避することもできます。

--パイプモード

もう一つのモードは並列--パイプです

このとき、パイプラインの前のコマンドはパラメータとしてではなく、次のコマンドへの標準入力として使用されます。

例えば:

cat my_large_log |parallel --pipe grep パターン 

--pipe がない場合、mylog の各行は grep パターン行コマンドに展開されます。 --pipe を使用すると、コマンドは実行のために異なるコアに分散されることを除いて、cat mylog | grep pattern と変わりません。

はい、これが基本的なコンセプトです。残りは、使用するコアの数、place_holder の置き換え、パラメータを渡すさまざまな方法、並列実行だが結果出力の順序を保証する (-k)、魔法のようなノード間並列コンピューティングなど、さまざまなパラメータの具体的な使用法だけです。詳しくは、man ページを参照してください。

ボーナス

並列処理に変換するための小さなツールを手元に用意しておくと、日常的な実行が高速化されるだけでなく、同時実行性をテストできるという利点もあります。

多くのインターフェースは、同時操作時に何らかのバグを抱えます。たとえば、コード レベルでデータベースがロックされていないと判断されることがあります。その結果、同時リクエストが行われ、各リクエストはサーバーに到達したときに通過すると判断されます。これらが一緒に記述されると、制限を超えてしまいます。以前は、 for ループはシリアルで実行されていたため、これらの問題は発生しませんでした。しかし、実際に並行性をテストしたい場合は、スクリプトを作成するか、Python のマルチプロセッシングを使用してそれをカプセル化する必要があります。しかし、私は手元に並列を持っており、bashrcに次の2つのエイリアスを追加しました

エイリアス p='parallel'
エイリアス pp='parallel --pipe -k' 

この方法で並行性を作成するのは非常に便利です。パイプラインの後に p を追加するだけで、いつでも並行性を作成して応答を観察できます。

例えば

シーケンス 50 | p -n0 -q curl 'example.com'

コアの数に基づいて同時リクエストを実行します。 -n0 は、seq 出力が後続のコマンドにパラメータとして渡されないことを意味します。

ゴシップタイム: GNU の Xianglin Sao

フリーソフトウェアの噂話が好きな私は、新しくて興味深いソフトウェアを発見するたびに、必ずキーワードsite:https://news.ycombinator.com關鍵詞site:http://www.reddit.com/ Google で検索します。レビューをチェックすると、議論中に予期せぬことが見つかるかもしれません。

その後、ハッカーニュースで苦情を見ました。基本的には、並列実行をトリガーするたびに、このツールを学術目的で使用する場合(生命科学関連の多くの人がこのツールを使用しています)は彼の論文を引用する必要があり、そうでない場合は 10,000 ユーロを支払う必要があるというテキストがポップアップ表示されるとのことでした。私はこのことから、「Nagware」という単語を学びました。これは特に、Tang Seng のようにしつこく金を払わせようとするソフトウェアを指します。ただし、この学生が言ったように、実際に使用されている場合は記事を引用する必要があると思います。

ナグウェアのメッセージとその内容を除けば、これは素晴らしいツールであることに同意します。cd や ls の作者が同じ態度をとっていたらどうなるか想像してみてください...

さらに、著者は他の人に自分のソフトウェアを引用してもらいたいと強く望んでおり、NEWS でもそのことを目にしました。

原則時間

stackoverflowの著者の回答を直接引用する

GNU Parallel は汎用的な並列化ツールであり、同じマシン上または SSH アクセスできる複数のマシン上でジョブを並列に実行することを容易にします。

4 つの CPU で実行したい 32 個の異なるジョブがある場合、並列化するための最も簡単な方法は、各 CPU で 8 つのジョブを実行することです。

GNU Parallel は、1 つのプロセスが終了すると新しいプロセスを生成します。これにより、CPU がアクティブな状態になり、時間が節約されます。

結論は

この記事では主に、実際の並列ツールを紹介し、その 2 つの主なモードについて説明し、ヒントを提供し、GNU の世界の知られざる側面について語ります。お役に立てれば幸いです。

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

<<:  Linux での MySQL 5.6.27 インストール チュートリアル

>>:  Angularフレームワークのビュー抽象定義の詳細な説明

推薦する

非常に便利な CSS 開発ツール 8 つを紹介

CSS3 パターン ギャラリーこの CSS3 パターン ライブラリには、純粋な CSS3 を使用して...

Tomcat が設定ファイルを外部に配置するためのソリューション

質問通常の開発では、プロジェクトを Tomcat にデプロイする場合、プロジェクトを war パッケ...

Linux で履歴コマンドを表示および実行する方法

履歴コマンドを表示し、指定されたコマンドを実行します owen@owen:~/owen/softwa...

Vue が DingTalk の出勤カレンダーを実装

この記事では、DingTalkの勤怠カレンダーを実装するためのVueの具体的なコードを参考までに共有...

Mysqlデータベースの文字化けに対処する方法

MySQL では、データベースの文字化けは一般的に文字セットを設定することで修正できますが、文字化け...

MySQL における Decimal 型と Float Double 型の違い (詳細説明)

MySQL には、10 進数などの標準データ型だけでなく、float や double などの非標...

Vueはキー表示のショートカットキー効果を取得する入力コンポーネントを実装します

ページ上でショートカットキーをカスタマイズする要件に遭遇し、ショートカットキーを設定して表示する場所...

バックエンドから返される 100,000 個のデータをフロントエンドでより適切に表示するにはどうすればよいですか?

目次予備作業バックエンド構築フロントエンドページダイレクトレンダリングsetTimeout ページン...

VirtualBox の仮想ディスク vdi ファイルの容量を拡張する方法 (グラフィック チュートリアル)

VirtualBoxのインストールディレクトリを見つけます。ディレクトリ内には容量を拡張するために...

inline-blockプロパティとの互換性

<br />1年前、インターネット上にはinline-blockプロパティに関する記事は...

Ubuntu 18.04 MySQL 8.0 のインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 8.0のインストールと設定方法を参考までに紹介します。具体的な内容は以下の...

Linux whatisコマンドの使い方

01. コマンドの概要whatis コマンドは、システム コマンドの簡単な説明を含むいくつかの特別な...

HTML にオーディオファイルを挿入してブラウザで再生する場合の互換性の問題

HTML にオーディオ ファイルを挿入した後 (mp3 ファイルを再生した後) に発生したいくつかの...

Tencent Cloud Server Centosにデータディスクをマウントする方法

まず、ハードディスクデバイスにデータディスクがあるかどうかを確認します # まずfdisk -lを実...