我的目标是创建一个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)
答案 0 :(得分:4)
您必须在md5表上创建一个索引 - 无论哈希值是否唯一 - 没有索引意味着线性访问会在每次访问时抛出所有记录。
查看文档,看起来创建索引就像发布一样简单
您数据库上的CREATE INDEX hash ON keys (hash)
。