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フレームワークのビュー抽象定義の詳細な説明

推薦する

Linux CentOS でスクリプトを定期的に実行するように設定する方法

多くの場合、サーバーでスクリプトを定期的に実行して操作をトリガーする必要があります。たとえば、Qin...

Vueのイベント処理とイベント修飾子の詳細な説明

<div id="ルート"> <h2>頑張れ、{{na...

MySQL で 1000 万件のレコードをすばやくクエリする方法

目次通常のページングクエリ最適化する方法大きなオフセット使用ID制限大量データ問題の最適化通常のペー...

jquery-multiselect を使用した IE6 のバグの解決方法

jquery-multiselect (ドロップダウン ボックスをチェックボックス付きの複数選択コン...

MySQLデータベースを操作するためのコマンドラインツールmycliの簡単な紹介

GitHub にはあらゆる種類の魔法のツールがあります。今日、私はデータベースを操作するためのコマン...

Axios の二次カプセル化の例 プロジェクトのデモ

1. なぜパッケージングを行うのですか?全体的なコード呼び出し、リクエストの公開処理、パーソナライズ...

CocosCreator Huarongdaoデジタルパズルの詳しい説明

目次序文文章1. パネル2. 華容島ソリューション3. コード4. 注記序文華容路とは何ですか? 誰...

LinuxにVSCodeをダウンロードしてインストールし、プログラミングを使用して現在の時刻を出力する

rpmコマンドがソフトウェアのインストールに使用するパラメータはどれですか: -i rpm コマンド...

MySQL マスタースレーブレプリケーションの読み書き分離構造の詳細な説明

MySQL マスタースレーブ設定MySQL のマスター/スレーブ レプリケーションと読み取り/書き込...

HTML メタタグの一般的な使用例のコレクション

マタタグとは<meta> 要素は、検索エンジン向けの説明やキーワード、更新頻度など、ペー...

XHTML 入門チュートリアル: XHTML ハイパーリンク

ハイパーリンクはインターネット全体を接続していると言っても過言ではありません。ハイパーリンクは、別の...

ネイティブ js を使用してライブ バレット スクリーンのスクロール効果をシミュレートします。

目次1. 基本原則2. 特定のコード要約する1. 基本原則まず、生放送エリアを10の部分に分割し(個...

MySQL binlog を開く手順

Binlog は、MySQL データの変更を記録するために使用されるバイナリ ログ ファイルです。B...

MySQL の時間差関数 TIMESTAMPDIFF と DATEDIFF の使用

時間差関数 TIMESTAMPDIFF と DATEDIFF の使用SQL ステートメント、特にスト...

ウェブデザインの詳細分析に関する詳細な議論

設計業務では、設計者がレビューに参加したり、リーダーの一部が設計案の詳細が足りないと言っているのをよ...