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

推薦する

MySQL で自動インクリメントシーケンスを実装するためのサンプルコード

1. シーケンステーブルを作成する テーブル `sequence` を作成します ( `name` ...

シンプルなフロントエンドのページング効果を実現する js

比較的シンプルな業務のプロジェクトもありますが、フロントエンドのページングを多用します。プラグインの...

TomcatをダウンロードしてLinuxにインストールする詳細な手順

Linux に触れたばかりの方には、この内容が役に立つかもしれません。Linux にしばらく触れてい...

MySQL に大量のデータを挿入する 4 つの方法の例

序文この記事では主に、MySQLに大量のデータを挿入する4つの方法を紹介し、参考と学習のために共有し...

MySQLユーザー削除バグを解決する

著者が MySQL を使用してユーザーを追加していたところ、ユーザー名が間違って記述されていることに...

MySQL の同時実行性の問題と解決策の分析

目次1. 背景2. テーブルロックによるクエリの遅延3. オンラインでテーブル構造を変更するとどのよ...

Vue ダイナミック バインディング アイコンの完全な手順

0 アイコンと画像の違いアイコンは文字であり、画像はバイナリ ストリームです。つまり、画像はアイコン...

Docker コンテナ入門から夢中になるまで(推奨)

1. Docker とは何ですか?仮想マシンについては誰もが知っています。Windows に Li...

CentOS7 で MySQL データベースにリモート接続できない理由と解決策

序文最近、仕事で問題が発生しました。 Centos7 システムでは MySQL にリモート接続できな...

Q&A: XML と HTML の違い

Q: xml と html の違いがわかりません。違いは何ですか? A: XMLと HTML の違い...

CSS変数を使用して、クールで素晴らしいフローティング効果を実現します。

最近、Grover の Web サイトで楽しいホバー アニメーションを見つけ、自分自身のインスピレー...

OpenLayers 3 のベクターマップソースの読み込みの問題を解決する

1. ベクターマップベクター グラフィックスは直線と曲線を使用してグラフィックスを表します。これらの...

MySQL インデックスの原理と使用例の分析

この記事では、例を使用して MySQL インデックスの原理と使用方法を説明します。ご参考までに、詳細...

MySQLデータベースの使用仕様の概要

導入: MySQL データベースの仕様に関しては、皆さんも何らかのドキュメントを読んだことがあると思...

deepin apt コマンドを使用して最新バージョンの docker をインストールする方法

ステップ1: Ubuntuソースを追加するルートに切り替える suルートソフトウェアソースファイルの...