在数据库中存储一个7百万密钥python字典

我必须处理一个700万字的密钥字典(密钥的数量最终可达到约5000万).由于我几乎没有足够的内存来保存它,我决定存储它.

我的字典看起来像这样:

dictionary={(int1,int2):int3,...}

首先,我尝试使用sqlite3将其存储在sqlite数据库中.
存储它所需的时间是完全可以的(大约70秒).使用timeit:

>>>import sqlite3
>>>conn=sqlite3.connect('test_sqlite.sqlite')
>>>c=conn.cursor()
>>>c.execute('create table test (int1 int, int2 int, int3 int)')
>>>conn.commit()
>>>conn.close()
>>>import timeit
>>>timeit.timeit('c.executemany("insert into test values (?,?,?)",((key[0],key[1],dictionary[key]) for key in dictionary.iterkeys())),setup='import sqlite3;conn=sqlite3.connect("test_sqlite.sqlite");c=conn.cursor();dictionary={(i,i+1):i+2 for i in xrange(7000000)}',number=1)
70.7033872604

但是,我需要使用这个存储的字典来检索某些值,但每个SELECT似乎需要大约1.5秒.由于我需要访问大约一百万个值,因此令人沮丧:

>>>timeit.timeit('c.execute("select id1 from test where id2=={}".format(value)).fetchone()[0]',setup=import sqlite3;conn=sqlite3.connect("test_sqlite.sqlite");c=conn.cursor();value=5555',number=1)
1.5300869941711426

然后我试着在架子上更新我的字典.现在,在我的搁置词典中获取值的时间相当不错:

>>> timeit.timeit('a=f[key]',setup='import shelve;f=shelve.open("test_timeit","r");key="1000"',number=10000)
0.320019006729126

因此即使我做了几百万个像这样的请求,总时间应该是大约一百秒.

但是出现了一个新问题,现在将字典存放在架子上所需的时间并不能让我满意.

>>> timeit.timeit('f.update(dictio)',setup='import shelve;f=shelve.open("test_timeit","c");dictio={"({},{})".format(i,i+1):i+2 for i in xrange(7000000)}',number=1)
504.728841782

必须在此数量上添加将以前的密钥(它们是元组)转换为字符串所需的额外时间.使用repr:

>>>timeit.timeit('repr.repr((1,2))',setup='import repr',number=7000000)
61.6035461426

这总共566.332387924将我的字典更新为一个架子……

我不想腌制我的字典,因为它意味着如果我想稍后使用它,我将不得不加载整个字典.

有什么方法可以改进这两种方法中的一种,以便有更好的访问时间/加载时间?

谢谢你的帮助 !

解决方法:

对于像这样的大型表的查询要快速返回,您需要索引相关列.在你的情况下,我会将其添加为主键.

create table test (
    Int1 integer,
    Int2 integer,
    Int3 integer,
    Primary key (int1, int2)
)
上一篇:防止python搁置腐败


下一篇:day20序列化和模块导入