python - 按值对大字典进行排序
问题描述
我正在使用 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'
等)。
我愿意使用一个简单的数据库,只要它支持多进程,或者更好的方式来处理字典。
解决方案
您希望从庞大的数据库中查找前 100 个键。读入 10,000 条记录(比方说)并丢弃除前 100 条之外的所有记录。再读入 10,000 - 100 条,然后丢弃除前 100 条之外的所有记录。重复直到您完成整个数据库。完成后,您将获得 100 条最大的记录。
您也可以使用堆。将 100 条记录读入堆后,一次将一条记录添加到堆中,然后删除最小的一条。添加另一个然后删除最小的。
这两种方法在记录数乘以一个小常数时基本上是线性的。(实际上是 O(n log k),总共有 n 条记录,你想要前 k 条)。
== 更新 ==
我不知道 heapq.nlargest 和 heap.nsmallest。这些似乎完全符合调用者的要求,并且可能完全按照上述方式实现。使用已经存在的库例程比使用自己的库更好。
推荐阅读
- google-sheets - 如何在已发布的 Google 表格文档中显示不相邻的范围?
- android - 安卓。单击 RecyclerView 中的项目时加载 Intent
- python - 如何为不同键设置最小值的行的属性
- typescript - 基于派生类的初始化对象类型,其中在基类中执行初始化
- java - 如何在 Spring Boot 2.3 中检索“spring.config.location”参数的文件路径?
- amazon-web-services - Terraform (AWS) 使用循环逻辑动态创建私有 acl
- ruby-on-rails - ActiveAdmin I18n.locale 在测试开发时自动更改
- r - R中data.frame的多级嵌套列表
- javascript - 预加载图像并将它们用作 div 元素的背景
- express - 具有单独会话的共享 API