【发布时间】:2013-08-05 14:43:38
【问题描述】:
我的目标是创建一个 MD5 哈希数据库,然后对照它检查另一个哈希列表,看看它们是否存在于数据库中。
我有一个使用anydbm 的有效解决方案,如果您不熟悉,它的工作方式与python 中的字典完全一样,但您不必一次将整个内容加载到内存中。数据库的创建相当慢(大约 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)
【问题讨论】:
-
sqlite 不是为了性能。
-
从非索引、非唯一字段执行
select *会导致数据库扫描查询表中的每条记录,而基于哈希的查找具有唯一键,如字典/@987654330 @key:value store 每个key只存储一次,所以只需要找到1条记录。正如@Carsten 所说,您需要使用索引来加快查询速度(如果可能,请考虑添加唯一约束)。 -
MD5 哈希值在源文档中不会是唯一的,但我不一定需要保留每个条目。有没有办法可以设置它以使哈希值是唯一的,但是如果我尝试添加重复项,它只会忽略操作?
-
这个子句我没用过,但是看起来像你需要的:sqlite.org/lang_conflict.html ...使用IGNORE语句
标签: python performance sqlite dbm