【问题标题】:Merge two big dictionaries in parallel并行合并两个大字典
【发布时间】:2015-07-15 14:39:43
【问题描述】:

我有两个大字典。他们每个人看起来都是这样的 {"md5":(value1,value2)}。它们中的每一个都包含多达 1000 万个元素(我使用 dict.fromkeys() 来生成它们)。但现在我想将它们合并为一个以消除重复。最快的方法是什么?我可以并行化它吗?这似乎是一个 CPU 受限问题,因为如果我使用 dict.update(),一个内核始终 100% 使用,而其他内核处于空闲状态。

【问题讨论】:

  • 谢谢。我知道字典在修改值方面是线程安全的,但有两个挑战:大尺寸和共享内存。您的任何帖子都没有解决这些挑战。

标签: python performance dictionary merge


【解决方案1】:

感谢您的所有回答。 其实我自己写了一段代码就找到了答案。它与归并排序非常相似,但我已经对其进行了测试,并与我尝试过的所有其他方法进行了比较。

这是一段代码。这个想法是首先对这两个字典进行排序(这很快)并将它们转换为元组列表,然后将它们合并。我希望有人能打败我,但这是迄今为止我所知道的最快的。结果是一个排序后的元组列表,所以如果我想合并更多的大字典,我可以将新的输入排序并合并到现有的元组列表中。

def merge(dict_01,dict_02):
    sorted_01 = sorted(dict_01.items(),key=operator.itemgetter(0))
    sorted_02 = sorted(dict_02.items(),key=operator.itemgetter(0))

    # merge them
    l = 0
    r = 0
    while True:
        if sorted_02[r][0] > sorted_01[l][0]:
            l += 1
            # if l reaches the end, append all left on sorted_02 to sorted_01 and break
            if l == len(sorted_01):
                 sorted_01 += sorted_02[r:]
                 break
        elif sorted_02[r][0] < sorted_01[l][0]:
            sorted_01.insert(l,sorted_02[r])
            r += 1
            l += 1
            # if r reached the end, merging is done, break
            if r == len(sorted_02):
                break
            # if l reaches the end, append all left on sorted_02 to sorted_01 and break
            if l == len(sorted_01):
                sorted_01 += sorted_02[r:]
                break
        else:
            r += 1
            if r == len(sorted_02):
                break


   return sorted_01

【讨论】:

    【解决方案2】:

    试试这个:

    x = {"md5":("value1","value2")}
    y = {"md7":("value1","value2")}
    z = dict(x.items() + y.items())
    print z
    

    【讨论】:

      【解决方案3】:

      这个答案可能是“作弊”,但如果您使用ChainMap,则此合并(仅创建 ChainMap)为 O(1)。尽可能快。您无需使用 dict,而是使用类似 dict 的对象。

      权衡是结果集合中的每个查找在基础字典中使用 1 或 2 个查找。如果这种开销在您的情况下是可以接受的,那么 ChainMap 就是答案。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-12
      • 2013-04-17
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多