Popenに単純に投げるとoom_killerに殺されることになる
1000枚程度の画像ファイルをconvertで適当な処理をやる工程をpython3のsubprocessで
単純にforで回して
for file in files: subprocess.Popen([convertへのコマンド], cwd=dir)
みたいな感じをOSXでやると、メモリいっぱいまで食いつぶして気持ちいい爆速処理ができます。仮想8コア100%。CPU稼動率はっぴゃくぱーせんと! なんだか楽しくなってきます。
そんなに入らないぃぃぃ状態まで食わせるので、当然他の操作は出来ません。ファンがめったにない高速回転になるのが気持ちいい。回転数が下がったら処理が終わりみたいな感じ。
投げっぱなしなので、適当な手段で次の逐次処理に追い越されないようにしないといけませんが、OSXでは処理前ファイルと処理後ファイルの数を比較して、合わなかったら寝てろで止められます。書き出し中のファイルはカウントしないようです。
これをLinuxでやると予定通り、oom_killerに殺されてシステム自体が動作不能になります。
どこでも動く制限付きのマルチスレッドに変更せねば…。
ということで、
「フォルダ1」にtiffファイルが入っていて、処理済みのファイルを「フォルダ2」に書き出す処理。 def hage(x): subprocess.check_output(['convert'---x[n]を適当に当てはめてコマンドを形成--], cwd='./'--カレントディレクトリで走らせる決め打ち) def main(): todo_list = [] for file in files: todo_list.append(フォーループで回すのに使うはずだった変数一覧) # ここで読み込みファイルのフルパスと書き出しファイル名のリストを作るので順不同に処理されても問題なし p = Pool(いい塩梅なプロセス制限の数値) p.map(hage, todo_list)
check_outputのsubprocessがPool()個づつ回ります。
ここで、またPopenを使ってしまうと、戻りがないので、ひたすらぶっこまれて最初に戻るになります。
6.2MBのTiffファイルを200枚の処理で、単純にcheck_outputに投げると、1ファイルずつの処理になるので約280秒。Pool(8)ちゃんに回してもらうと、約60秒。
単純にPopenに投げたときより少しだけ速かったので、ちょっとびっくり。
食いつぶされても死なないようにOSXがなんかしてるオーバーヘッド的な何かがなくなり、論理コア数分(うちのは4コア。論理8コア)のプロセスしか使わないのでお気楽になるのだと思われます。