我试图比较python中sqlite3数据库中的两个表。这个问题的答案之一:
Comparing two sqlite3 tables using python
给出了解决方案:
或者,将它们导入SQLite表。然后您可以使用以下查询:
SELECT * FROM a INTERSECT SELECT * FROM b;
SELECT * FROM a EXCEPT SELECT * FROM b;
获取两个表中存在的行,或仅存在于一个表中。
这适用于行数少于一百万的表,但对于我的程序来说太慢了,这需要比较超过一百亿行的表。 (脚本只耗费了10亿分钟,只有1亿行。)
有没有更快的方法来比较python中的两个sqlite3表?
我想过尝试比较两个数据库文件的哈希值,但是对一个名为dbhash on sqlite.org的程序的概述声称即使两个数据库文件的内容是相同的某些操作“也可能导致巨大的变化到原始数据库文件,因此在文件级别导致非常不同的SHA1哈希,“这让我觉得这不起作用,除非我运行某种脚本以有序的方式查询所有数据然后散列(如dbhash程序确实如此),但这会更快吗?
或者我应该完全使用另一个可以比sqlite3更快地执行此比较的数据库?
非常感谢任何想法或建议。
编辑:到目前为止已经提出了一些好的想法,但要澄清一下:表格的顺序无关紧要,只是内容。
答案 0 :(得分:2)
您可以采用以下解决方法:
intersect
/ except
。如果更改表格不是一个选项,您可以创建新的表格,将哈希值与散列记录的主键或rowid相关联。
通过这种方式,您可以将比较所需的部分处理时间转换为插入/更新记录的时间。我希望在执行比较时比在比较所有行的所有列时更快。
当然,你的哈希必须知道值的顺序,并为每个排列产生唯一的值;一个简单的校验和就不够了。建议:
您可以测试将散列存储为字符串,blob或整数(假设它适合64位)会对速度产生影响。
答案 1 :(得分:1)
是的,单个硬盘驱动器上的单个线程(甚至几个)需要花费大量时间来抓取数十亿个原始数据。
使用更强大的数据库引擎显然会更好,但索引所有列并不会真正有用。
您必须在多个系统之间进行预先计算或分发数据集......
如果你有很多内存,你可以尝试先在/dev/shm
中复制SQLite文件,这样你就可以直接从内存中读取数据并提高性能。