pythonでmultiprocessingを使う際の注意

python2.6からmultiprocessingと言う便利な機能が入った。multiprocessingについては、こちら

関数を渡すと自動的に、プロセスを分割してくれて、マルチプロセス環境で、プログラムを実行してくると言う物。

その中で、データを引き渡すのに、manager.dictを使う場合がある。その際は、manager.dictは遅いので、注意が必要だ。

このようなコードを書く。上の参考ページ、manager.dictの例を参照

from multiprocessing import Process, Manager

def f(d):
   #d.keysでキーを取った上で、d[k]のような形で参照
   for k in d.keys():
      for k1 in d.keys():
        i= d[k] * d[k1]
        i=i*2  
   #↑物凄く遅い
   #こういう場合は、ローカルの辞書にコピー
   dtmp={}
   for k in d:
      dtmp[k]=d[k]
   #その後、上記のような処理を行う。
   for k in dtmp:
      for k1 in dtmp:
        i= dtmp[k] * dtmp[k1]
        i=i*2
   #100倍ぐらい違った。
    
if __name__ == '__main__':
manager = Manager()
 
d = manager.dict()
for k in range(1000):
     d[k]=k*100 #dに何か巨大なデータを入れる。
p = Process(target=f, args=(d))
p.start()
p.join()
 
print d

上記のように、巨大なデータを扱う場合は、一旦プロセス内部で、ローカルな辞書に変更した上で、使うと早い。特に2重ループなどを行う際は、差が顕著だ。 良く見たら、上の参照ページに、manager.dictは遅いと書いてあった。辞書だと思って使ったのは、間違いだった。


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-02-01 (日) 14:38:23 (3370d)