首页 > 解决方案 > 按值对大字典进行排序

问题描述

我正在使用 Python 3.6.4。我有一个由多个进程共享的大型嵌套字典,最终可能包含超过 40 亿个键,我希望按值(“总计”)对其进行排序。字典是这样的。

scores = { 'id_1': {'total': 3, 'golf': 1, 'football': 2}, 
           'id_2': {'total': 6, 'basketball': 1, 'football': 3, 'tennis': 2}}

字典是使用Manager.dict()每个进程将更新单个游戏分数和total. 我现在正在测试一个更小的字典示例,当所有进程都完成写入它时,我正在使用sorted()to sort total

sorted_scores = sorted(scores.item(), key = lambda item: item[1]['total'], reverse=True)

我相信用 40 亿个键对字典进行排序可能效率低下,所以我想知道是否有其他方法可以做到这一点。最终,我只想找到前 100 名的分数、对应id_x的和条目(例如'basketball''football'等)。

我愿意使用一个简单的数据库,只要它支持多进程,或者更好的方式来处理字典。

标签: pythondictionary

解决方案


您希望从庞大的数据库中查找前 100 个键。读入 10,000 条记录(比方说)并丢弃除前 100 条之外的所有记录。再读入 10,000 - 100 条,然后丢弃除前 100 条之外的所有记录。重复直到您完成整个数据库。完成后,您将获得 100 条最大的记录。

您也可以使用堆。将 100 条记录读入堆后,一次将一条记录添加到堆中,然后删除最小的一条。添加另一个然后删除最小的。

这两种方法在记录数乘以一个小常数时基本上是线性的。(实际上是 O(n log k),总共有 n 条记录,你想要前 k 条)。

== 更新 ==

我不知道 heapq.nlargest 和 heap.nsmallest。这些似乎完全符合调用者的要求,并且可能完全按照上述方式实现。使用已经存在的库例程比使用自己的库更好。


推荐阅读