替代一个非常大的字典(约4000万个键)

时间:2017-09-20 01:56:13

标签: python large-files shelve large-data

我有一个相当大的字典,大约有4千万个密钥,我只是通过将{key: value, key: value, ...}写入文本文件而天真存储。我没有考虑到我无法真实地访问这些数据的事实,因为python厌恶加载和评估1.44GB文本文件作为字典。

我知道我可以使用类似shelve的内容来访问数据而无需一次性读取所有数据,但我不确定如何将此文本文件转换为搁置文件没有重新生成所有数据(我不想这样做)。有没有更好的替代方案来存储,访问,并可能在以后更改这么多数据?如果没有,我应该如何将这种怪物转换为shelve可用的格式?

如果重要,字典的格式为{(int, int, int int): [[int, int], Bool]}

2 个答案:

答案 0 :(得分:0)

Redis是一个内存中的键值存储,可用于解决此类问题。

有几个Python clients

hmset操作允许您插入多个键值。

答案 1 :(得分:0)

https://github.com/dagnelies/pysos

https://github.com/dagnelies/pysos

它像普通的python dict一样工作,但具有的优势是,它在Windows上比shelve效率高得多,并且它也是跨平台的,这与shelve数据存储不同基于操作系统。

要安装:

pip install pysos

用法:

import pysos
db = pysos.Dict('somefile')
db['hello'] = 'persistence!'

仅给出一个大致数字,这是一个迷你基准测试(在Windows笔记本电脑上):

import pysos
t = time.time()
import time
N = 100 * 1000
db = pysos.Dict("test.db")
for i in range(N):
    db["key_" + str(i)] = {"some": "object_" + str(i)}
db.close()

print('PYSOS time:', time.time() - t)
# => PYSOS time: 3.424309253692627

生成的文件约为3.5 Mb。

因此,在您的情况下,如果一百万个键/值对插入大约需要1分钟时间,那么插入所有内容大约需要一个小时。当然,机器的规格可能会影响很大。这只是一个非常的粗略估计。