2011-10-16 85 views
2

我有一個這樣的文件:並行化設定交叉點操作?

A 1 
A 1 
A 2 
A 3 
B 2 
B 3 
C 2 
C 3 

我轉換成如下的數據結構:

s = [set([1, 2, 3]), set([2, 3]), set([2,3])] 

要查找所有2組合的交點的長度,我使用以下:

from itertools import combinations 
for i in combinations(s, 2): 
    inter = i[0] & i[1] 
    print len(inter) 

s大小是300000個每個具有約1000的長度不同的集合。有兩個瓶頸:

  • 讀文件
  • 計算交點

的長度第一個是不可避免的也許但第二個可以得到改善。我有一臺64核心的機器,所以我想知道如何並行化這個程序。是否有某種地圖縮減庫可用於多核機器?

+0

我遇到了這個http://www.parallelpython.com/。它也許對你有用。 – spicavigo

+0

另外,你看看python的多處理模塊。 http://docs.python.org/library/multiprocessing.html – spicavigo

+0

您是否嘗試過在每次打印結果時都不打印每一個結果,而是採用計算的方式,而是收集數據(使用列表理解)和/或將其寫入文件(可能通過發電機)等? –

回答

0

如果您還沒有,請查看multiprocessing模塊。另外,雖然方便,但沒有必要使用itertools.combinations()來獲得一組所有獨特的2組合。如果您可以接受使用全局變量,那麼可以使用multiprocessing.Pool.map()將其轉換爲進程池。例如:

from multiprocessing import Pool 

def tally(n): 
    return [len(s[n] & t) for t in s[n+1:]] 

p=Pool() 
for resultset in p.map(tally, xrange(len(s)), chunksize=1): 
    for result in resultset: 
     print result 

tally()對在l一組在n位置與在單一過程中l每隔一個後續位置的一組交叉點。 p.map()使用與在cpu_count()中返回的許多進程並行執行該任務的每個位置l

https://gist.github.com/c576fd7f48be5f66deaa上有一個完整的工作示例,對於大型數據集,與在單個進程中僅運行內置的map()函數相比,我在四核機器上的性能得到顯着改善。