2

、私は次のコードを持っている:(簡体字)さまざまなPythonマルチプロセッシングコア間でタプルキーを使用してグローバル辞書を共有するにはどうすればよいですか?

def main_func(): 
    anotherDic = {} 
    dic = {(1,2):44, (4,6):33, (1,1):4, (2,3):4} 
    ks = dic.keys() 
    for i in ks: 
     func_A(anotherDic, i[0], i[1], dic[i], 5) 

をメイン辞書(DIC)はかなり大きいです、そしてループの5億の反復のために行きます。私はマルチコアマシン上でループを並列化するためにマルチプロセッシングを使いたいと思っています。私はいくつかのSOの質問とマルチプロセッシングのlibドキュメントを読んできました。これは非常に役に立ちましたvideoであり、まだ分かりません。 私はこのプログラムがこのループに達したときに複数のスレッドに分岐し、並列に実行し、すべてのプロセスが終了した後、ループセクションの後の行から単一プロセスでプログラムを続行する必要があります。 func_Aはdicから辞書値とキーを受け取り、いくつかの簡単な操作を計算し、anotherDicデータを更新します。同じi [0]キーがすべて同じプロセスで処理されている限り、これは独立したプロセスです。だから、コア間で自動的にデータを分割するプールマップ機能は使えません。キータプルの最初の要素でキーをソートし、スレッド間で手動で分割します。

どうすればプロセス間で非常に大きな辞書(dic)を渡したり共有したりできますか?異なるプロセスが異なるキー(つまり、それぞれのプロセスを処理するキーが他のプロセスと異なる)を読み書きします 私はこれに対する答えを見つけることができない場合は、各プロセスでより小さい一時的なdicを使用し、 dicsに参加してください。

次に、ループセクションのためにプロセスを強制的にforkしてmuliprocessorにすることができます。そして、ループの後に、すべてのプロセスが1つのスレッドの残りのコードを続行する前に結合しますか?

答えて

2

一般的な答えは、Managerオブジェクトを使用することです。ドキュメントから適応:

from multiprocessing import Process, Manager 

def f(d): 
    d[1] += '1' 
    d['2'] += 2 

if __name__ == '__main__': 
    manager = Manager() 

    d = manager.dict() 
    d[1] = '1' 
    d['2'] = 2 

    p1 = Process(target=f, args=(d,)) 
    p2 = Process(target=f, args=(d,)) 
    p1.start() 
    p2.start() 
    p1.join() 
    p2.join() 

    print d 

出力:

$ python mul.py 
{1: '111', '2': 6} 

オリジナルの答え:Python multiprocessing: How do I share a dict among multiple processes?

+0

おかげRaskayu。非常に大きな辞書にはマネージャメソッドが効率的ですか?それはdicのコピーを作成するのか、複数のプロセスが同じdicをメモリに使用するのでしょうか?私の場合、各プロセスが書き込んでいるキーは重複しません。 – cybergeek654

+1

@ cybergeek654 "multiprocessing.Managerを作成すると、別のサーバープロセスが生成され、Managerによって作成されたすべてのオブジェクトをホストします。あなたが見ることができるように、それは一度しか作成されないので、メモリ内で1つのコピーになります。 – Raskayu

関連する問題