【问题标题】:sqlite with Python is unreasonably slow compared to anydbm与 anydbm 相比,带有 Python 的 sqlite 慢得不合理
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 2014-04-30
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    相关资源
    最近更新 更多