何千もの単純なスクリプトを並列に実行

何千もの単純なスクリプトを並列に実行

〜6500のディレクトリで簡単なPythonスクリプトを実行したいと思います。最も簡単で効率が悪い方法は次のとおりです。

for d in *_directorynumber; do (cd "$d" && cp ../script.py . && python ./script.py );done

これは明らかに永遠にかかる。代わりに並列に実行してみました。

task(){
   cd "$d" && python ./script.py . 
}

次に、次のようにこれを実行します。

for d in *_directorynumber; do 
  task "$d" &
done

約500回実行した後、次のエラーが発生します。

-bash: fork: retry: Resource temporarily unavailable
-bash: fork: retry: No child processes
-bash: fork: retry: No child processes
-bash: fork: retry: No child processes

これを並列化する他の方法はありますか?

ベストアンサー1

プロセス数は限られています。コマンドを使用して表示できますulimit -u。同じコマンドを使用して増やすことができます。共有コンピュータの場合、これを行う権限がない可能性があります。

6500のプロセスを並列に実行するのはおそらく悪い考えでしょう。

  • 6500のプロセスにはRAMが必要です。
  • タスクがCPUにバインドされている場合は、より多くのコンテキスト切り替えが必要になるため、速度が遅くなります。
  • ジョブがI / Oバインドされている場合、6500のプロセスが異なるディレクトリにアクセスすると速度が遅くなります。

あなたの仕事はいくつかの並列プロセスの利点を享受するかもしれませんが、あなたが持っているCPUコアの数の小さな部分に制限する必要があります。

おすすめ記事