有没有更快的方法来比较python中的两个sqlite3表?

时间:2017-07-13 00:36:56

标签: python sql database sqlite

我试图比较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更快地执行此比较的数据库?

非常感谢任何想法或建议。

编辑:到目前为止已经提出了一些好的想法,但要澄清一下:表格的顺序无关紧要,只是内容。

2 个答案:

答案 0 :(得分:2)

您可以采用以下解决方法:

  1. 在每个表中添加一列,您可以在其中存储所有其他列的内容。
  2. 为新列添加索引。
  3. 计算并将哈希与记录一起存储。
  4. 比较表格的哈希列,而不是使用intersect / except
  5. 如果更改表格不是一个选项,您可以创建新的表格,将哈希值与散列记录的主键或rowid相关联。

    通过这种方式,您可以将比较所需的部分处理时间转换为插入/更新记录的时间。我希望在执行比较时比在比较所有行的所有列时更快。

    当然,你的哈希必须知道值的顺序,并为每个排列产生唯一的值;一个简单的校验和就不够了。建议:

    1. 将每个列值转换为字符串。
    2. 将字符串与分隔符连接起来,保证不会在值本身中出现。
    3. 在连接字符串上使用SHA1或类似的复杂散列算法。
    4. 您可以测试将散列存储为字符串,blob或整数(假设它适合64位)会对速度产生影响。

答案 1 :(得分:1)

是的,单个硬盘驱动器上的单个线程(甚至几个)需要花费大量时间来抓取数十亿个原始数据。

使用更强大的数据库引擎显然会更好,但索引所有列并不会真正有用。

您必须在多个系统之间进行预先计算或分发数据集......

如果你有很多内存,你可以尝试先在/dev/shm中复制SQLite文件,这样你就可以直接从内存中读取数据并提高性能。