2017-05-23 2 views
1

だけというのnoob:私は私がPythonマルチプロセッシングプールとプロセスの比較?この文脈で

for file_chunk in file_chunks: 
    p = Process(target=my_func, args=(file_chunk, my_arg2)) 
    p.start() 
    # without .join(), otherwise main proc has to wait 
    # for proc1 to finish so it can start proc2 

をしようとしたが、それがないように見えた

短い時間で巨大なファイルを処理できるように、複数のプロセスで一つの機能を実行しようとしています

とても速いです。

現在、私は実際にジョブを並行して実行しているのかと思います。私もプールについて考えましたが、私はpython2を使用していますが、関数に2つの引数をマップするのは醜いです。

私は上記のコードで何かが見つからないか、このように(上のように)作成されたプロセスが本当にパラレルで実行されていますか?

+0

処理するチャンクの数はいくつですか?あなたはここに何百もの新しいプロセスを巻き込んでいますか?プールを使用すると、一定数のワーカーを作成し、システムに過負荷をかけることなく、チャンク(タスク)のセットをワーカーに分割することができます。 – svohara

+0

@svohara私は20のチャンクしか持っていないので、このコードでは発生しない20倍の速い処理を実現することができます。 – doniyor

答えて

2

スピードアップは、チャンクの量ではなく、PCのCPUコアの量に比例します。

理想的には、4つのCPUコアがある場合は、4倍のスピードアップが必要です。パフォーマンスの向上を検討する際には、IPCオーバーヘッドなどの他の要因も考慮する必要があります。

多くのプロセスを起動すると、CPUに対して互いに競合するため、パフォーマンスに悪影響を及ぼします。

ほとんどのロジックには、multiprocessing.Poolを使用することをおすすめします。引数が複数ある場合は、apply_asyncメソッドを使用してください。

from multiprocessing import Pool 

pool = Pool() 

for file_chunk in file_chunks: 
    pool.apply_async(my_func, args=(file_chunk, arg1, arg2)) 
1

私はどちらかの専門家ではないけど、何を試してみてくださいと、これは、利用可能なCPU(n_jobs)の番号を使用して、特定の機能(random_function)を実行しますjoblibパラレル

from joblib import Parallel, delayed 
import multiprocessing as mp 

def random_function(args): 
    pass 

proc = mp.cpu_count() 

Parallel(n_jobs=proc)(delayed(random_function)(args) for args in args_list) 

を使用しています。

気軽にdocsをお読みください!

+0

これはうーんクールなものです。それを知らなかった – doniyor

関連する問題