私はxargs
呼び出しPythonスクリプトを使用して約3000万の小さなファイルを処理しています。並列化プロセスを使用したいですxargs
。私が使用するコマンドは次のとおりです。
find ./data -name "*.json" -print0 |
xargs -0 -I{} -P 40 python Convert.py {} > log.txt
基本的にConvert.py
小学校程度は読めますよJSONファイル(4kb)を処理し、別の4kbファイルを作成します。私は40個のCPUコアを持つサーバーで実行しています。そして、サーバーではCPUを多く使用する他のプロセスは実行されません。
htopを監視して(しかし、CPUのパフォーマンスを監視する他の良い方法はありますか?)、-P 40
予想ほど速くないことがわかりました。時々、すべてのコアが停止し、3〜4秒間ほぼゼロに低下し、60〜70%に回復します。その後、並列プロセスの数をに減らそうとしましたが、まだ-P 20-30
速度はそれほど高速ではありません。理想的な動作は線形加速です。 xargsを並列に使用するための提案はありますか?
ベストアンサー1
私はあなたの問題が次のとおりです。Python。各ファイルにどのような処理が行われるかは明らかではありませんが、メモリ内のデータだけを処理すると仮定すると、3千万個のPython仮想マシン(インタプリタ)が実行され、ランタイムが支配するようになります。
単一のファイルの代わりにファイルのリストを取得するようにPythonプログラムをリファクタリングできる場合、パフォーマンスは大幅に向上します。その後、xargsを使用してパフォーマンスをさらに向上させることができます。たとえば、40個のプロセスがあり、それぞれ1000個のファイルを処理します。
find ./data -name "*.json" -print0 |
xargs -0 -L1000 -P 40 python Convert.py
これはPythonが悪くて遅い言語だと言うものではありません。それは悪くて遅い言語です。開始時刻に最適化されていません。これは、仮想マシンベースの言語または解釈された言語と見なすことができます。たとえば、Javaははるかに悪いです。プログラムがCで書かれている場合は、各ファイルを処理するために別々のオペレーティングシステムプロセスを起動するのにまだコストがかかりますが、コストははるかに少なくなります。
そこから-P
データの読み書き中にアイドルプロセッサを利用するために、プロセスの数を増やして速度をわずかに上げることができるかどうかを確認できます。