Python 最节省磁盘空间的内存映射字典为2000万个键值对,速度没有太大问题
我有大约2000万个键值对。我需要创建两个字典 第一本词典: 数值为整数,从0到2000万。键是长度为40个字符的字符串,例如“36ae99662ec931a3c20cffdecb39b69a8f7f23fd” 第二本词典: 第一本字典的反面。密钥是整数,从0到2000万。这些值是长度为40个字符的字符串,例如“36ae99662ec931a3c20cffdecb39b69a8f7f23fd” 我认为对于第二个字典,有更多的选项,因为索引可以用作键。对于第二个选项,sqlite3看起来很有希望 查找速度不是很重要,1秒的查找应该可以。主要的问题是我没有太多的空间来存放字典 至于我对第一类词典的最佳猜测,来自这篇文章Python 最节省磁盘空间的内存映射字典为2000万个键值对,速度没有太大问题,python,database,dictionary,Python,Database,Dictionary,我有大约2000万个键值对。我需要创建两个字典 第一本词典: 数值为整数,从0到2000万。键是长度为40个字符的字符串,例如“36ae99662ec931a3c20cffdecb39b69a8f7f23fd” 第二本词典: 第一本字典的反面。密钥是整数,从0到2000万。这些值是长度为40个字符的字符串,例如“36ae99662ec931a3c20cffdecb39b69a8f7f23fd” 我认为对于第二个字典,有更多的选项,因为索引可以用作键。对于第二个选项,sqlite3看起来很有希望
对于第一种类型的字典,dbm似乎是一个不错的解决方案,因为所有键和值都存储为字节,尽管答案是7年前在2012年给出的。我不确定它今天是否是一个合适的解决方案。字符串看起来是十六进制的。在这种情况下,可以使用
binascii.unhexlify
将它们转换为二进制字符串。这就节省了50%的空间
In [2]: import binascii
In [3]: binascii.unhexlify('36ae99662ec931a3c20cffdecb39b69a8f7f23fd')
Out[3]: b'6\xae\x99f.\xc91\xa3\xc2\x0c\xff\xde\xcb9\xb6\x9a\x8f\x7f#\xfd'
In [4]: len(binascii.unhexlify('36ae99662ec931a3c20cffdecb39b69a8f7f23fd'))
Out[4]: 20
对于一台现代计算机来说,2000万个键/值对并不算什么。看看纯数据的大小(字符串为20字节,整数为4字节),我们说的大约是半GB
In [5]: 20e6 * (20 + 4) / 1e9
Out[5]: 0.48
最节省空间的方法是只创建一个按键排序的键/值对数组。因为我们知道每一对都是24字节,所以在一个mmapped文件中访问它们是很简单的;你可以只使用切片。我会使用一个搜索引擎进行查找
这没有存储开销。但是插入一个值将是低效的。考虑到您的第二个字典与第一个字典正好相反,我认为您可能需要使用单表数据库。您可以在字符串上有一个主键和一个索引,以便快速查找。类似sqlite的东西是有意义的
你在处理多大的内存?对于python来说,它可能仍然在内存中,但这取决于您有多少内存。我有大约12 Gig的ram。sqlite做字符串索引吗?我查了一下,但什么也没找到