【发布时间】:2014-10-28 22:29:40
【问题描述】:
我有大量数据需要快速查找,通常我会使用字典。但是,我需要存储大约 6 亿个键值对,而当尝试将其存储在字典中时,它不适合内存。
我意识到如果字典将键和值存储为具有固定长度(即 32 位)的整数,则它可以节省内存。我可以通过使用 numpy 数组来解决我的问题,对数据进行排序,然后使用搜索来找到正确的值(占用大约 8GB):
import numpy as np
key_a = np.zeros(600e6, dtype=np.int64)
values_a = np.zeros(600e6, dtype=np.int32)
# ... Fill arrays ...
# Find value using key:
index = np.searchsorted(key_a, key_to_find)
value_to_find = values_a[index]
这种方法不如使用哈希快。
我最理想的做法是实现一个字典,但使用固定大小的 numpy 数组作为主干以节省空间?我还希望字典针对整数进行优化。为什么 numpy 还没有提供这样的东西,我将如何去做呢?
【问题讨论】:
-
据我所知,numpy 数组并不打算用作数据库,即快速索引。也许 pandas (pandas.pydata.org) 可以帮助你...
-
您是否考虑过使用像
dbm这样的磁盘结构?它显然不会像自定义 int32 哈希那样快速或紧凑,但它会简单得多(例如,只需一个import语句,而不是您必须编写和调试的 100 行代码),而且它还免费为您提供持久性(我猜您会想要)。 -
速度至关重要,因此内存解决方案更可取
-
我应该早点问这个,但是……你经常查找一堆彼此靠近的键吗?如果是这样,哈希将比排序数组产生严重成本,因为您将丢失所有缓存和 VM 局部性。而且,根据您的数据分布情况,有一些方法可以加快二进制搜索的速度,这可能会有所帮助。
-
@abarnert 是的,密钥只在一定范围内。如何加快二分搜索?
标签: python numpy dictionary