計算速度を落とすために、Pythonでマルチプロセッシングを構築しようとしていますが、マルチプロセッシング後のように全体の計算速度が大幅に低下しました。私は4つの異なるプロセスを作成し、各プロセスへの入力となる4つの異なるデータフレームにdataFrameを分割しました。各プロセスのタイミングをとった後、オーバーヘッドコストが重要であるように見え、これらのオーバーヘッドコストを削減する方法があるかどうか疑問に思っていました。Pythonでマルチプロセッシングの時間を短縮する方法
私はwindows7、python 3.5を使用しています。私のマシンには8つのコアがあります。
def doSomething(args, dataPassed,):
processing data, and calculating outputs
def parallelize_dataframe(df, nestedApply):
df_split = np.array_split(df, 4)
pool = multiprocessing.Pool(4)
df = pool.map(nestedApply, df_split)
print ('finished with Simulation')
time = float((dt.datetime.now() - startTime).total_seconds())
pool.close()
pool.join()
def nestedApply(df):
func2 = partial(doSomething, args=())
res = df.apply(func2, axis=1)
res = [output Tables]
return res
if __name__ == '__main__':
data = pd.read_sql_query(query, conn)
parallelize_dataframe(data, nestedApply)
シングルスレッド化がマルチプロセッシングにどれくらいかかっていたかを列挙できますか? – Fruitspunchsamurai
あなたは何個のCPU /コアを持っていますか(ハイパースレッドではなく、実際のもの)? CPU集約的な作業のように見えるので、コアの数よりも多くの数に分割すると、処理が遅くなります。また、データフレームはどれくらい大きく、 'doSomething'はどれくらいの費用がかかりますか?データフレームを各サブプロセスに渡すには、シリアル化する必要があり(ピクルス経由)、デシリアライズする必要があります。フレームが大きく、 'doSomething'が安ければ、ほとんどの時間がオーバーヘッドに費やされます。 –
@ Fruitspunchsamurai シングルスレッドを実行するのに26分かかりましたが、マッピング機能を実行するのに33分、全体的に71分かかりました。 – Hojin