并行化集合交叉运算?

时间:2011-10-16 04:50:26

标签: python parallel-processing mapreduce

我有一个这样的文件:

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的大小为300,000个不同的集合,每个集合的长度约为1,000。有两个瓶颈:

  • 阅读文件
  • 计算交叉口的长度

第一个可能是不可避免的,但第二个可以改进。我有一台64核的机器,所以我想知道如何并行化这个程序。是否有某种地图缩减库可用于多核机器?

1 个答案:

答案 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的{​​{1}}中的集合上执行集合交集,并在单个进程中执行n中的每个其他后续位置。 l使用p.map()中返回的进程为l中的每个位置并行化该任务。

https://gist.github.com/c576fd7f48be5f66deaa有一个完整的工作示例,对于大型数据集,与在内核上运行cpu_count()函数相比,我在四核机器上的性能有了显着提高单一过程。