2017-03-23 12 views
0

だからこれは私のコードPythonのマルチプロセッシングは、通常の実装よりも遅くなり

def get_h(tmp):                 
    tmp =[map(float,line.split()[3:6]) for line in tmp[:768]] 
    return hbond(tmp,side) 

def get_sc(tmp): 
    return popvar(tmp) 

def calculate():         
    hframe=[] 
    pl=Pool() 
    s=time()          
    with open(file) as f: 
     for _ in xrange(100): 
      tmp=list(islice(f,9,9+atoms))   
      if not tmp: break 
      hframe.append(pl.apply_async(get_h,[tmp])) 
    hframe=[i.get() for i in hframe] 
    print time()-s #takes ~ 1 sec 

    s=time() 
    ll=[pl.apply_async(get_sc,[tmp]) for tmp in izip(*hframe)] 
    ll=[i.get() for i in ll] 
    print time()-s #takes ~23 sec !!! 

    s=time() 
    ll=[get_sc(tmp) for tmp in izip(*hframe)] 
    print time()-s #takes ~ 1 sec 

calculateは、ここでの主な機能です。それは2つのことを行います。 1stはブロックに分割されたファイルを読み込み、2ndはFortranプログラムから作成された別の関数を呼び出し、それ以降の計算を行います。ファイルからデータブロックを読み出すために、Pythonマルチプロセッシングpoolを使用しました。しかし、計算部分にpoolを使用すると、通常の実装よりも遅く(ほぼ23倍)なります。ここで何が起きているのですか?どうすれば修正できますか?

答えて

0

ワーカーと親プロセスはアドレス空間を共有しません。

したがって、処理中のデータはプロセス間通信(キュー)経由で親からワーカーに送信されます。 大量のデータ(場合によっては768行)が発生すると、オーバーヘッドが大きくなります。

各作業者に使用するスライスの境界を与え、作業者にファイル自体を読み取らせる方がよいでしょう。このようにして、大量のデータを親プロセスから作業者に移動する必要はありません。

関連する問題