与anydbm相比,使用Python的sqlite速度慢得不合理
我的目标是创建一个包含MD5哈希的数据库,然后对照它检查另一个哈希列表,看看数据库中是否存在这些哈希 我有一个使用与anydbm相比,使用Python的sqlite速度慢得不合理,python,performance,sqlite,dbm,Python,Performance,Sqlite,Dbm,我的目标是创建一个包含MD5哈希的数据库,然后对照它检查另一个哈希列表,看看数据库中是否存在这些哈希 我有一个使用anydbm的有效解决方案,如果您不熟悉该解决方案,它的工作原理与python中的字典完全相同,但您不必立即将整个内容加载到内存中。数据库的创建相当慢(大约2个半小时内有1亿个条目),检索速度适中(1到2秒钟内有10万个条目)。检查哈希是否存在就像在dbm中检查哈希一样简单 为了提高性能,我尝试用sqlite制作一个有效的解决方案。创建速度极快,在几分钟内创建了所有1亿个条目。但检索
anydbm
的有效解决方案,如果您不熟悉该解决方案,它的工作原理与python中的字典完全相同,但您不必立即将整个内容加载到内存中。数据库的创建相当慢(大约2个半小时内有1亿个条目),检索速度适中(1到2秒钟内有10万个条目)。检查哈希是否存在就像在dbm中检查哈希一样简单
为了提高性能,我尝试用sqlite制作一个有效的解决方案。创建速度极快,在几分钟内创建了所有1亿个条目。但检索一个条目需要15秒以上的时间。这是不合理的
我不是一个SQL专业人士,所以我想知道我是否只是在使用那些过于复杂的命令
详情如下:
创建表:c.execute(“'create table keys(id integer not null主键自动递增,散列文本,警报文本)”)
添加条目(在循环中):c.execute(''insert-into-keys(hash,alert)值(?,)'',(hash,1”)
检索(也循环):
您必须在md5表上创建一个索引—无论哈希是否唯一—没有索引意味着线性访问会在每次访问时抛出所有记录 看看这些文档,创建索引似乎和发布索引一样简单
在数据库的键上创建索引散列(hash)
。您必须在md5表上创建索引-无论散列是否唯一-没有索引意味着线性访问会在每次访问时抛出所有记录
看看这些文档,创建索引似乎和发布索引一样简单
在数据库的键上创建索引哈希(哈希)
。sqlite不用于性能。从非索引、非唯一字段执行选择*
,会导致数据库扫描查询表中的每条记录,而基于散列的具有唯一键的查找(如dictionary/anydbm
key:value-store)只会将每个键存储一次,因此只需要找到一条记录。正如@卡斯滕所说,您需要使用索引来更快地查询(并且考虑如果可能的话添加一个唯一的约束)。MD5散列在源文档中不是唯一的,但是我不一定需要保存每个条目。有没有一种方法可以设置它,使散列是唯一的,但如果我尝试添加一个重复的,它会忽略op?我没有使用这个子句,但它看起来像您需要的:。。。使用IGNORE语句SQLite不是为了性能。从非索引、非唯一字段执行select*
操作会导致数据库扫描查询表中的每条记录,而使用唯一键(如dictionary/anydbm
key:value store)的基于哈希的查找只会将每个键存储一次,因此只需要找到一条记录。正如@卡斯滕所说,您需要使用索引来更快地查询(并且考虑如果可能的话添加一个唯一的约束)。MD5散列在源文档中不是唯一的,但是我不一定需要保存每个条目。有没有一种方法可以设置它,使散列是唯一的,但如果我尝试添加一个重复的,它会忽略op?我没有使用这个子句,但它看起来像您需要的:。。。使用IGNORE语句
c.execute('''select * from keys where hash = ? ''', (hash,))
hits = c.fetchall()
numhits += len(hits)