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的原因是,按鍵得到在下一步中夾雜了常規dict(在接下來的步驟我在串聯的字典中numpy的陣列,並將它們存儲在稀疏coo_matrix)。

由於字典密鑰是唯一的,因此應該可以並行運行generateKeys()並在多核計算機上更快地填寫這兩個字典。

我已經查看了multiprocessing包和一些示例,但我看到的示例僅針對單個返回值,沒有有序的詞典。我真的不明白如何在我的環境中應用它。任何人都可以告訴我這是如何工作?

+0

如果你需要保持以便'transitionFunction'要求,並行是不是要走的路.. 。 – 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()) 

results會比同階的stateDict值,那麼你就可以建立自己的字典附:

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

如果transitionFunction可以以任何順序應用您的狀態,那麼你就會有意想不到的後果......

+0

感謝您的幫助。我認爲這應該可以解決我的問題。現在接下來的問題是我無法在類中調用它:'p.map(self.transitionFunction,self.stateDict.values())'返回以下錯誤:'不能pickle :屬性查找__builtin __。instancemethod失敗。 – Forzaa

+0

對於這個問題,請參考已經提到的許多帖子:http://stackoverflow.com/search?tab=votes&q=Can%27t%20pickle%20%3Ctype%20%27instancemethod%27%3E – Cyrbil

0

似乎有一個在獨立進程之間共享字典的解決方案。查看here的描述。恕我直言,這是處理您的問題最簡單的方法。但是,此解決方案不支持OrderedDict。所以,如果你能找到一種方法來做到這一點,那就行了。也許你可以通過/將你的字典轉換成所需的形式。