Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 最节省磁盘空间的内存映射字典为2000万个键值对,速度没有太大问题_Python_Database_Dictionary - Fatal编程技术网

Python 最节省磁盘空间的内存映射字典为2000万个键值对,速度没有太大问题

Python 最节省磁盘空间的内存映射字典为2000万个键值对,速度没有太大问题,python,database,dictionary,Python,Database,Dictionary,我有大约2000万个键值对。我需要创建两个字典 第一本词典: 数值为整数,从0到2000万。键是长度为40个字符的字符串,例如“36ae99662ec931a3c20cffdecb39b69a8f7f23fd” 第二本词典: 第一本字典的反面。密钥是整数,从0到2000万。这些值是长度为40个字符的字符串,例如“36ae99662ec931a3c20cffdecb39b69a8f7f23fd” 我认为对于第二个字典,有更多的选项,因为索引可以用作键。对于第二个选项,sqlite3看起来很有希望

我有大约2000万个键值对。我需要创建两个字典

第一本词典: 数值为整数,从0到2000万。键是长度为40个字符的字符串,例如“36ae99662ec931a3c20cffdecb39b69a8f7f23fd”

第二本词典: 第一本字典的反面。密钥是整数,从0到2000万。这些值是长度为40个字符的字符串,例如“36ae99662ec931a3c20cffdecb39b69a8f7f23fd”

我认为对于第二个字典,有更多的选项,因为索引可以用作键。对于第二个选项,sqlite3看起来很有希望

查找速度不是很重要,1秒的查找应该可以。主要的问题是我没有太多的空间来存放字典

至于我对第一类词典的最佳猜测,来自这篇文章


对于第一种类型的字典,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做字符串索引吗?我查了一下,但什么也没找到