Python3.8, CPUは4コア8スレッドです。
「csvファイルを一つ読んで内容を処理し、結果を画像ファイル等に書き出す」という処理を、大量のcsvに対して行っています。
以下のコードような感じです。
python
1import glob 2import pandas as pd 3 4files = glob.glob("./*csv) 5for(file in files): 6 df = pd.read_csv(file) 7 # ファイルごとの処理&書き出し処理をここで行う
処理にかかった時間は以下のようになりました。
# ターミナルのtimeコマンドで計測 real 1m18.548s user 1m17.061s sys 0m1.484s
ファイルの数が膨大なので、並列で処理を行って全体を高速化しようとしました。
以下のようにコードを変更しました。
python
1import concurrent.futures 2 3files = glob.glob("./*csv") 4n = len(files)//4 5files1 = files[0:n] 6files2 = files[n:2*n] 7files3 = files[2*n:3*n] 8files4 = files[3*n:] 9 10def func(files): 11 for(file in files): 12 df = pd.read_csv(file) 13 # ファイルごとの処理&書き出し処理をここで行う 14 15executor = concurrent.futures.ProcessPoolExecutor(max_workers=4) 16executor.submit(func, files1) 17executor.submit(func, files2) 18executor.submit(func, files3) 19executor.submit(func, files4)
これで処理が4倍速になる...と期待しましたが結果は以下のようになりました。
real 0m21.629s user 1m23.304s sys 0m1.683s
処理にかかるuser時間がほぼ同じに(むしろ遅く)なっています。
なぜ全体が速くならないのでしょうか。
自分で調べた範囲では、このページを見る感じマルチプロセスならちゃんと速くなってくれるはずという認識なのですが、誤りがあればご教授いただきたいです。
回答1件
あなたの回答
tips
プレビュー