タグ付けされた質問 「parallelism」

複数のプロセッサを利用するためのタスクの並列実行


9
stdinを並列プロセスに拡散する
stdin上のファイルのリストを処理するタスクがあります。プログラムの起動時間はかなり長く、各ファイルにかかる時間は大きく異なります。これらのプロセスを相当数生成し、ビジーでないプロセスに作業をディスパッチします。私が望んでいることをほとんど実行するいくつかの異なるコマンドラインツールがありますが、私はそれを2つのほぼ機能するオプションに絞り込みました: find . -type f | split -n r/24 -u --filter="myjob" find . -type f | parallel --pipe -u -l 1 myjob 問題はsplit、純粋なラウンドロビンを実行するため、プロセスの1つが遅れて残り、操作全体の完了が遅れることです。一方parallel、入力のN行またはバイトごとに1つのプロセスを生成したいので、起動時のオーバーヘッドに多くの時間を費やすことになります。 プロセスを再利用し、標準化されていない標準化されたプロセスにフィードラインを供給するこのようなものはありますか?

4
並行して作成された他の3つのストリームから単一の出力ストリームを作成する
異なるフォーマットの3種類のデータがあります。データ型ごとに、それを単一の統一フォーマットに変換するPythonスクリプトがあります。 このPythonスクリプトは遅く、CPUにバインドされている(マルチコアマシンのシングルコアに)ため、スクリプトの3つのインスタンスを実行し(データタイプごとに1つ)、それらの出力を組み合わせてに渡しsortます。基本的に、これと同等です: { ./handle_1.py; ./handle_2.py; ./handle_3.py } | sort -n しかし、3つのスクリプトが並行して実行されます。 ストリームを処理するスクリプトのn個のインスタンス間で、いくつかのstdoutストリームをラウンドロビンするためにGNU が使用されているこの質問を見つけましたsplit。 分割されたmanページから: -n, --number=CHUNKS generate CHUNKS output files. See below CHUNKS may be: N split into N files based on size of input K/N output Kth of N to stdout l/N split into N files without splitting lines …

1
シェルスクリプトで2つのコマンドを同時に実行することは可能ですか?
コマンドラインで&コマンドをバックグラウンドで実行できることを知っています。しかし、スクリプトでそれを実行できるかどうか疑問に思っています。 次のようなスクリプトがあります。 date_stamp=$(date +"%Y-%m-%d" --date='yesterday') shopt -s extglob cd /my/working/directory/ sh ./stay/get_it_ios.sh sh ./stay/get_it_mix.sh cd stay zip ../stay_$date_stamp.zip ./*201* rm ./stay/!(*py|*sh) そして、私が実行したいsh ./stay/get_it_ios.shとsh ./stay/get_it_mix.sh一緒に、より正確なデータを取得します。シェルスクリプトのスコープでこれを行うことは可能ですか?

2
ddを並列化する方法は?
現在dd、入力(if)としてスパースファイルを使用し、出力(of)としてファイルを使用して起動すると問題が発生しますconv=sparse。ddCPUの1つのコア(Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz4コア+ 4 Intelハイパースレッド)のみ(1コアの100%)を使用しているようなので、並列化が可能かどうか疑問に思っていましたdd。行ったことがある 調べてみるinfo ddとman dd、corutils 8.23のバージョンに組み込み関数があるようです。 (それが私のニーズに合っているかどうかを理解せずに)パッケージsgp_ddからチェックしsg3-utilsますが、スパースファイルを処理することができないようです dcfldd 並列化機能がないようです 私の知る限り 複数のスレッドでのプログラムパーツの内部処理を備えた拡張バージョン/フォーク(I / Oパフォーマンスを低下させるコンテキスト変更を回避する)が優先されます parallelローカルで実行されているGNUのソリューションが優先されます カスタム(テストされていない可能性がある)コードスニペット I / O集中型操作のボトルネックとなるCPUを回避する方法 Linux 3.13を搭載したUbuntu 14.04でコマンドを実行し、スパースファイルをサポートする任意のファイルシステムでスパースファイルのディスクイメージを処理したいと思います(少なくとも、ソリューションは1つの特定のファイルシステムにバインドされるべきではありません)。 背景:私は、zfsに11 TBのスパースファイル(約2 TBのデータを含む)のコピーを作成しようとしています(zfsonlinux 0.6.4不安定バージョン、バグが多く、CPUボトルネックの原因(最終的には低速のホール検索))。(非常に一般的な方法で)ddを並列化する方法の問題については、何も変更されません。
10 linux  dd  parallelism 

1
CPUコアを1つだけ使用する
並行プログラムのパフォーマンステストを実行する必要があります。私の要件は、1つの CPUコアでのみ実行する必要があることです。(スレッドを協調させたくありません-常にコンテキストを切り替えたいです)。 だから私は2つの質問があります: 最善の解決策-(CPUコアを使用しないようにOSを強制するために)自分のプログラムに対してのみ1つのCPUコアのみに署名して予約する方法。それは不可能だと思いますが、おそらく私は間違っています... 1つのCPUコアのみを使用するようにLinux(Fedora 24)を設定する方法は?

3
xargs並列使用の修正
私はxargspythonスクリプトを呼び出して約3000万の小さなファイルを処理するために使用しています。xargsプロセスの並列化に使用したいと思います。私が使用しているコマンドは: find ./data -name "*.json" -print0 | xargs -0 -I{} -P 40 python Convert.py {} > log.txt 基本的にConvert.pyは、小さなjsonファイル(4kb)を読み取り、いくつかの処理を行って、別の4kbファイルに書き込みます。CPUコアが40のサーバーで実行しています。また、このサーバーでは他のCPU負荷の高いプロセスは実行されていません。 htopを監視することで(ところで、CPUパフォーマンスを監視する他の良い方法はありますか?)、私はそれ-P 40が期待されるほど速くないことを発見しました。場合によっては、すべてのコアがフリーズして3〜4秒間ほぼゼロになり、その後60〜70%に回復します。次に、並列プロセスの数をに減らしてみますが-P 20-30、まだそれほど高速ではありません。理想的な動作は、線形スピードアップである必要があります。xargsの並列使用に関する提案はありますか?

1
bashスクリプトでのマルチスレッド/フォーク
次の形式のbashスクリプトを作成しました。 #!/bin/bash start=$(date +%s) inFile="input.txt" outFile="output.csv" rm -f $inFile $outFile while read line do -- Block of Commands done < "$inFile" end=$(date +%s) runtime=$((end-start)) echo "Program has finished execution in $runtime seconds." whileループから読み込みます$inFile、ライン上でいくつかのアクティビティを実行して、結果をダンプ$outFile。 以下のよう$inFile3500+ラインの長さで、スクリプトが完全に実行するための6-7時間かかります。この時間を最小限に抑えるために、このスクリプトではマルチスレッドまたはフォークを使用することを計画しています。8つの子プロセスを作成すると、からの8行$inFileが同時に処理されます。 これはどのように行うことができますか?

2
forループの並列化
for次のコードのループを並列化したいと思います。これを行う方法? #!/bin/bash N=$1 n=$2 for (( i=1; i<=$N; i++ )); do min=100000000000000 //set min to some garbage value for (( j=1; j<=$n; j++ )); do val=$(/path/to/a.out) val2=`echo $val | bc` if (( $val2 < $min )); then min=$val2; fi done arr=("${arr[@]}" "$min") done


1
$できます!並列実行されているスクリプトで使用すると競合状態が発生しますか?
次のようなコードで、並行して実行される複数のbashスクリプトがあるとします。 #!/bin/bash tail -f /dev/null & echo "pid is "$! そのスクリプトの$!最新のバックグラウンドタスクのPIDを取得することが保証されていますか、それともグローバルな最新のバックグラウンドタスクですか?この機能に依存すると、PIDが別のスクリプトで開始されたプロセスからのPIDである場合に競合状態が発生する可能性があるかどうか、私は興味があります。

4
ファイルをアーカイブに保存するための仮想書き込み専用ファイルシステム
非常に多くの(完全ではないが)同一のファイルを大量に作成する、恥ずかしいほど並列処理を行っています。「オンザフライ」でファイルをアーカイブして、データが必要以上のスペースを消費しないようにする方法はありますか? プロセス自体はコマンドラインパラメータを受け入れ、作成された各ファイルの名前をstdoutに出力します。私はそれを呼び出して、parallel --gnu(別のプロセスからの)入力の分散と出力の収集を処理します。 arg_generating_process | parallel --gnu my_process | magic_otf_compressor パイプの最初の部分の簡単な例bash: for ((f = 0; $f < 100000; f++)); do touch $f; echo $f; done どのようにmagic_otf_compressor見えるでしょうか?各入力行をファイル名として扱い、各ファイルを圧縮.tarアーカイブ(処理されたすべてのファイルに対して同じアーカイブ!)にコピーして、それを削除することになっています。(実際には、処理された各ファイルの名前を出力するだけで十分です。別| parallel --gnu rmのファイルがファイルの削除を処理できます。) そのようなツールはありますか?各ファイルを個別に圧縮することは考慮していません。これは、あまりにも多くのスペースを浪費します。私は調べましたarchivemount(ファイルシステムをメモリに保持します->不可能、ファイルが大きすぎて多すぎます)およびavfs(FUSEと連携させることができませんでした)。私は何を逃したのですか? 私はそのようなツールを自分でハッキングすることからほんの一歩ですが、誰かが以前にそれをしたはずです... 編集:本質的に私は標準入力フロントエンドを探していると思いますlibtar(tarコマンドラインから引数を読み取るコマンドラインフロントエンドとは対照的です)。

2
kshに実装された貧乏人のGNU Parallel?
私は、GNU Parallelの機能を使用して、コマンドとそれが並列に供給されるリストを実行し、すべての完了後にそれを吐き出すことができるようにしたいのですが、すべてのサーバーにGNU Parallelをインストールしたくありません。 または、おそらく並列バージョンxargsですか? GNU Parallelが行うことのksh実装はありますか?この場合、すべての出力をパイプまたは格納できる限り、GNU Parallelのように順番に実行する必要はありません。一時ファイルの使用も避けたいです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.