マルチコア CPU を使用して Linux コマンドを高速化する方法 (GNU Parallel)

マルチコア CPU を使用して Linux コマンドを高速化する方法 (GNU Parallel)

非常に大量のデータ(数百 GB)を計算する必要があったことはありますか?または、その内部を検索したり、その他の操作(並列化できないもの)を実行したりします。データの専門家の皆さん、私はあなたに話しかけています。 4 コア以上の CPU をお持ちの場合でも、grep、bzip2、wc、awk、sed などの適切なツールはシングルスレッドであり、1 つの CPU コアしか使用できません。

漫画のキャラクター、カートマンのセリフを言い換えると、「これらのコアをどうやって使うのか?」

Linux コマンドですべての CPU コアを使用するには、GNU Parallel コマンドを使用する必要があります。このコマンドを使用すると、すべての CPU コアが単一のマシンで魔法のようなマップ削減操作を実行できるようになります。もちろん、これには、あまり使用されない –pipes パラメーター (–spreadstdin とも呼ばれます) も必要です。こうすることで、負荷は CPU 間で均等に分散されます。

ZIP2形式

bzip2 は gzip よりも優れた圧縮ツールですが、速度が遅いです。心配しないでください。この問題を解決する方法があります。

これまでの練習:

cat bigfile.bin | bzip2 --best > 圧縮ファイル.bz2

今はこんな感じです:

cat bigfile.bin | parallel --pipe --recend '' -k bzip2 --best > compressedfile.bz2

特に bzip2 の場合、GNU parallel はマルチコア CPU 上で非常に高速です。気がつけば、終わっていました。

グレップ

非常に大きなテキスト ファイルがある場合は、以前に次の操作を行ったことがあるかもしれません。

grep パターン bigfile.txt

今、次のことができるようになりました:

cat bigfile.txt | parallel --pipe grep 'パターン'

または、次のようになります。

cat bigfile.txt | parallel --block 10M --pipe grep 'パターン'

この 2 番目の使用法では、--block 10M パラメータが使用されています。これは、各コアが 1,000 万行を処理することを意味します。このパラメータを使用して、各 CPU コアで処理されるデータの行数を調整できます。

AWK

以下は、awk コマンドを使用して非常に大きなデータ ファイルを計算する例です。

一般的な使用法:

cat rands20M.txt | awk '{s+=$1} END {print s}'

今はこんな感じです:

cat rands20M.txt | parallel --pipe awk \'{s+=\$1} END {print s}\' | awk '{s+=$1} END {print s}'

これは少し複雑です。parallel コマンドの --pipe パラメータは、cat 出力を複数のブロックに分割し、awk 呼び出しにディスパッチして、多くのサブ計算操作を形成します。これらのサブ計算は、2 番目のパイプラインを介して同じ awk コマンドにパイプされ、最終結果が出力されます。最初の awk には 3 つのバックスラッシュがあり、これは GNU parallel が awk を呼び出すために必要です。

トイレ

ファイル内の行数をできるだけ早くカウントしたいですか?

従来のアプローチ:

wc -l ビッグファイル.txt

これで次のようになります:

cat bigfile.txt | parallel --pipe wc -l | awk '{s+=$1} END {print s}'

非常に巧妙です。まず、並列コマンドを使用して、多数の wc -l 呼び出しをサブ計算に「マップ」し、最後にパイプを介して awk に送信して集計します。

翻訳

巨大なファイル内で sed コマンドを使用して多数の置換操作を実行したいですか?

従来の慣行:

sed s^old^new^g bigfile.txt

次のことが可能になります:

cat bigfile.txt | parallel --pipe sed s^old^new^g

…そしてパイプを使用して出力を特定のファイルに保存できます。

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

以下もご興味があるかもしれません:
  • 15 分で学べる並列アーティファクト GNU Parallel 入門ガイド

<<:  MySQL Community Server 5.7.16 のグリーン バージョンをインストールしてリモート ログインを実装する方法

>>:  ReactのEffectListの簡単な分析

推薦する

Mysql一時テーブルの原理と作成方法の分析

この記事は主にMysql一時テーブルの原理と作成方法を紹介します。この記事のサンプルコードは非常に詳...

MySQL 8.0.20 Window10無料インストール版設定とNavicat管理チュートリアルグラフィック詳細説明

1. MySQL 8.0.20をダウンロードして解凍するダウンロードリンク: https://dev...

CSS でマウスの位置をマッピングし、マウスを動かしてページ要素を制御する (サンプル コード)

マウスの位置をマッピングしたり、ドラッグ効果を実装したりすることは、 JavaScriptで行うこと...

React refの使用例

目次refとは何かrefの使い方DOM要素に配置するクラスコンポーネントに配置する関数コンポーネント...

カルーセル効果を実現するためのネイティブJavaScript+CSS

この記事では、参考までに、カルーセル効果の具体的なコードをJavaScript+CSSを使用して実装...

ルート権限なしでログインするためのDockerソリューション

docker コマンドを初めて使用する場合、権限の問題を確認するメッセージが表示されます。 unix...

vue3.0共通コンポーネントの自動インポート方法の例

1. 前提条件インポートには require.context メソッドを使用します。vite で作成...

Centos6.6 で php7 + nginx 環境をインストールする方法

この記事では、centos6.6 で php7 + nginx 環境をインストールする方法について説...

MySQLのorder byとlimitを混在させる際の落とし穴の詳細な説明

MySQL では、ソートには order by を、ページングには limit をよく使用します。最...

CocosCreator ソースコードの解釈: エンジンの起動とメインループ

目次序文準備行く!文章プロセスを開始するメインループまとめ要約する序文準備皆さんは、こんなことを考え...

Navicatをサーバー上のdockerデータベースに接続する方法

dokekrでmysqlコンテナを起動するコマンドを使用します: docker run -p 330...

Vue+video.jsはビデオプレイリストを実装します

この記事では、ビデオプレイリストを実装するためのvue + video.jsの具体的なコードを参考ま...

Ubuntu 18.04 に phpMyAdmin をインストールするための詳細なチュートリアル

Ubuntu 18.04 上の Apache で動作するように phpMyAdmin をインストール...

HTML でのアンカーポイントの使用_PowerNode Java アカデミー

ここで、アンカー ポイントを制御するいくつかの状況をまとめてみましょう。 1. 同じページ <...

QQtabBar による CSS 命名仕様 BEM の詳細な紹介

QQtabBar の BEMまず、BEMとはどういう意味でしょうか? BEM は、ブロック、要素、修...