2016-04-14 14 views
0

私はPythonスクリプトdomaincheck.pyとjsonファイルdomain.jsonを持っています。私はdomainnameの参照を行うことができ、私には照会されたドメインのnameが与えられます。Bash/Shell:時間の節約

#Usage 1 : python domaincheck.py cnn.com 
#Usage 2 : python domaincheck.py bbc.com  

#Result 1 : CNN 
#Result 2: BBC 

は今、私は、入力ファイルset_3.txtを持っているし、ドメインのおよそ65000行です。私はバッチ処理に小さなシェルロジックを書きました。

$for i in $(cat set_3.txt); do python domaincheck.py $i;done 

は私が6時間前のようなスクリプトを実行し、今までそれだけで約2万のドメインを処理しました。

これを効率的に実行し、Bash/shellを使用して時間消費を削減する方法を教えてください。処理の時間を最小限に抑えるために使用できる並列実行メソッドはbashにありますか?

+4

[GNU並列](https:// ja。 wikipedia.org/wiki/GNU_parallel)。 – Cyrus

+0

ありがとうcyrus。あまりにもGNU並列メソッドを見ていきます。 – Arun

+0

注意:ほぼ同時に65,000件のクエリを開始すると、おそらくDNSサーバーの容量がオーバーロードされます。 200程度のバッチで保管してください。 – tripleee

答えて

2

、J + 0は、NUMを意味します。 numに等しい並列ジョブの数。

-k並列にマルチコアを使用して行うことができる入力

GNUの並列の順と同じ出力のシーケンスを保持コア。しかし、Pythonのプロセスは毎回実行されます。

プロセス作成オーバーヘッドの非効率性があります。

とにかくOSはすべてのコアを使用し、最も単純なので、シングルプロセスより高速です。

そして、並列化については、別の簡単な方法があり、http://www.parallelpython.com/

+0

これは 'cat'の無用な使い方です(http://www.iki.fi/era/unix/award.html)。あなたは ' tripleee

+1

thx ...しかし、あなたは知っている〜古い習慣は大いに死ぬ。しかし私は試してみよう! – han058

1

出力を表示するか、出力にリダイレクトしますか?

いずれかの方法で、(リダイレクト用)これを試してみてください。

for i in $(cat set_3.txt) 
do 
echo "$i $(python domaincheck.py $i)" >> temp.csv & 
sleep 1 
done 

これを行うには良い方法があるかもしれません。十分なRAMとCPUがあれば、同時のPythonプロセス(あなたの場合は65000)を開始することもできます。コアのGNU parallel

$cat set_3.txt | parallel -j+0 -k "python domaincheck.py {}" 

-j番号を使用して

+0

はい、stdoutをファイルにリダイレクトします。論理に感謝します。いくつかの同時実行メソッドのために私のpythonスクリプトを変更する必要があります。 – Arun

+0

http://mywiki.wooledge.org/DontReadLinesWithFor - あなたは '読んでいる間、私は;行う ...; done tripleee

+0

「スリープ1」では、18時間もかからない方法はありません。実際、それはおそらくオリジナルよりも遅いです!しかし、あなたが「睡眠」を取り除くと、あなたは他の問題に直面します。 – tripleee

1

ハン権利です。 Pythonコードを使用して入力ファイルを解析し、複数のスレッド/プロセスを起動してタスクを実行します。

関連する問題