与anydbm相比,使用Python的sqlite非常慢

时间:2013-08-05 14:43:39

标签: python performance sqlite dbm

我的目标是创建一个MD5哈希数据库,然后检查另一个哈希列表,看它们是否存在于数据库中。

我有一个使用anydbm的工作解决方案,如果您不熟悉,它的工作方式与python中的字典完全相同,但您不必立即将整个内容加载到内存中。 db的创建速度相当慢(大约2个半小时内有1亿个条目),检索速度适中(1到2秒内有100000个条目)。检查哈希是否存在就像if hash in dbm一样简单。

为了提高性能,我试图用sqlite制作一个有效的解决方案。创作速度非常快,几分钟内创造了所有1亿条目。但是一个条目的检索时间超过15秒。这是不合理的!

我不是SQL专家,所以我想知道我是否只是使用过于复杂化的命令。

他们如下:

创建表格:c.execute('''create table keys(id integer not null primary key autoincrement, hash text, alert text) ''')

添加条目(循环中):c.execute('''insert into keys(hash, alert) values (?,?) ''', (hash, "1"))

检索(也是循环的):

c.execute('''select * from keys where hash = ? ''', (hash,))
hits = c.fetchall() 
numhits += len(hits)

1 个答案:

答案 0 :(得分:4)

您必须在md5表上创建一个索引 - 无论哈希值是否唯一 - 没有索引意味着线性访问会在每次访问时抛出所有记录。

查看文档,看起来创建索引就像发布一样简单 您数据库上的CREATE INDEX hash ON keys (hash)