2016-11-03 9 views
0

私はPythonマルチプロセッシングプールのパフォーマンスでいくつかの奇妙な動作があります。次のコードでは、dataは、リサイズされる数百万の画像のndarrayであり、chunks_listは、dataのチャンクです。私はpool = Pool(14)を使用します。機能resize_imagesは一度に画像のグループをサイズ変更し、resize_imageは画像をサイズ変更します。 次のコード:マルチプロセッシングプールはチャンクでパフォーマンスが悪くなります

res = [pool.apply_async(resize_image, args=[img]).get() for img in data] 

は、このコードよりも高速である:

chunks_list = [data[i:i + chunk_size] for i in range(0, len(data), chunk_size)] 
res = [pool.apply_async(resize_images, args=[imgs]).get() for imgs in chunks_list] 

それはなぜですか?私は最初のコードが多くの「小さな」プロセスをCPUのプールに割り当てるので、その反対が真であると予想しました。しかし、チャンクは少ない割り当てを生成します。 私が望むものを達成するための効率的な方法はありますか? (GPUでもかまいません)

+0

イメージが大きければ、プロセス間でそれらを移動するだけで多くの時間を費やすことになります。 – BlackBear

+0

@BlackBearこれは私が塊にした理由ですが、遅いと驚いています。 –

+0

@BlackBear関数resize_imagesは、1つの画像のサイズを変更するresize_imageとは異なり、一度に画像のグループをサイズ変更することに注意してください。 –

答えて

-1
pool.map(preprocess_images, [imgs for imgs in chunks]) 

は、両方よりも速く作業します。

+0

add答えの詳細... – sushildlh

関連する問題