1

マルコフチェーンの遷移行列を生成するためにマルチプロセッシングを使いたいと思います。複数の戻り値と順序付けられた辞書でのマルチプロセッシングの使用

関数generateKeys()は、遷移後に状態空間の各状態に対して新しい速度と新しいキーを持つ辞書を生成します。

from collections import OrderedDict 

def generateKeys(): 
    idxDict = OrderedDict() 
    rateDict = OrderedDict() 
    for key,state in stateDict.items():    
     newkeys,rates = transitionFunction(state)    
     idxDict[key] = newkeys 
     rateDict[key] = rates 
    return idxDict,rateDict 

ここOrderedDictを使用する理由は、キーは次の工程(次のステップでは、私は辞書にnumpyの配列を連結し、スパースcoo_matrixに格納)に正規dictと混ざっ取得することです。

辞書キーは一意であるため、generateKeys()を並行して実行して、マルチコアマシン上で2つの辞書をはるかに速く埋めることができます。

私はmultiprocessingパッケージといくつかの例を調べましたが、私が見た例は単一の戻り値と順序付き辞書なしです。私は実際に私の設定でそれを適用する方法をまだ理解していません。誰でも私にこれをどのように表示できますか?

+0

...そしてあなたが予期しない結果を持つことになり、任意の順序であなたの状態を適用することはできません。.. – Cyrbil

+0

@Cyrbilええ、あなたは正しいです。私はすでに、正規の辞書を使用し、キーでソートすることで回避策を見ています。 – Forzaa

答えて

2

transitionFunctionは、任意の順序であなたの状態を適用することができる場合:あなたが使用することができます

transitionFunction('A') 
transitionFunction('B') 

# is equivalent to 
transitionFunction('B') 
transitionFunction('A') 

from multiprocessing import Pool, cpu_count 

p = Pool(cpu_count()) 
results = p.map(transitionFunction, stateDict.values()) 

resultsstateDictの値よりも同じ順序を持つことになります、あなたは、あなたの辞書を構築することができますwith:

idxDict = dict(zip(stateDict.keys(), i[0] for i in results)) 
rateDict = dict(zip(stateDict.keys(), i[1] for i in results)) 

transitionFunctionの場合は、あなたは `transitionFunction`コールの順序を維持する必要がある場合は、並列処理が進むべき道ではありません

+0

助けてくれてありがとう。私はこれが私の問題を解決するはずだと思います。 'p.map(self.transitionFunction、self.stateDict.values())'は次のエラーを返します: 'Can not pickle :属性検索__builtin __。インスタンスメソッドが失敗しました。 – Forzaa

+0

この問題については、すでに言及している多くの記事を参照してください:http://stackoverflow.com/search?tab=votes&q=Can%27t%20pickle%20%3Ctype%20%27instancemethod%27%3E – Cyrbil

0

独立したプロセス間で辞書を共有するための解決策があるようです。 discriptionについてはhereをご覧ください。 IMHOあなたの問題を処理する最も簡単な方法です。ただし、このソリューションはOrderedDictをサポートしていません。だから、もしあなたがそれらなしでそれをする方法を見つけることができれば、それはうまくいくでしょう。たぶん、あなたはあなたの後に希望のフォームにdictを渡す/変換することができます。

関連する問題