【问题标题】:Is there a faster way to compare two sqlite3 tables in python?有没有更快的方法来比较 python 中的两个 sqlite3 表?
【发布时间】:2023-04-10 14:48:02
【问题描述】:

我正在尝试在 python 中比较 sqlite3 数据库中的两个表。这个问题的答案之一:

Comparing two sqlite3 tables using python

给出一个解决方案:

或者,将它们导入 SQLite 表。然后您可以使用如下查询:

SELECT * FROM a INTERSECT SELECT * FROM b;

SELECT * FROM a EXCEPT SELECT * FROM b;

获取同时存在于两个表中的行,或仅存在于一个表中的行。

这对于少于一百万行的表非常有效,但对于我需要比较超过一百亿行的表的程序来说太慢了。 (仅 1 亿行脚本就用了十多分钟。)

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

我曾想过尝试比较两个数据库文件的哈希值,但一个名为 dbhash on sqlite.org 的程序的概述声称,即使两个数据库文件的内容相同,某些操作“也可能导致对原始数据库文件,因此会在文件级别导致非常不同的 SHA1 哈希”,这让我认为除非我运行某种脚本以有序方式查询所有数据然后对其进行哈希处理(如 dbhash程序可以),但这会更快吗?

或者我应该完全使用另一个可以比 sqlite3 更快地进行比较的数据库吗?

任何想法或建议将不胜感激。

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

【问题讨论】:

  • 减去将数据加载到 SQLite 数据库所需的时间,我希望在数据库中运行的比较比在 Python 代码中运行得更快。
  • 你能告诉你为什么需要那个吗?如果您想同步 dbs,请查看 litesynclitereplica。它们的速度要快得多。
  • @BernardoRamos 是的,我实际上是在尝试在多个不同节点之间同步信息,所以这看起来很有希望,谢谢。
  • your 数据库是否有主键?这将允许更有效的查找。
  • @CL。是的,确实如此。

标签: python sql database sqlite


【解决方案1】:

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

  1. 向每个表添加一列,在其中存储所有其他列内容的哈希值。
  2. 为新列添加索引。
  3. 计算哈希值并将其与记录一起存储。
  4. 比较表的哈希列,而不是使用intersect/except

如果更改表不是一个选项,您也许可以创建将哈希与哈希记录的主键或 rowid 相关联的新表。

这样,您将比较所需的部分处理时间转移到插入/更新记录的时间。我希望在您执行比较时这比当时比较所有行的所有列要快得多。

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

  1. 将每列值转换为字符串。
  2. 使用保证不会出现在值本身中的分隔符连接字符串。
  3. 对连接的字符串使用 SHA1 或类似复杂的散列算法。

您可以测试将哈希存储为字符串、blob 或整数(只要它适合 64 位)是否会影响速度。

【讨论】:

  • @nellapizza 我会对一些(粗略的)基准测试结果和细节感兴趣:加速因素是什么,你实际做了什么(不同的)?
【解决方案2】:

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

使用更强大的数据库引擎显然会更好,但索引所有列最终并没有真​​正的帮助。

您必须求助于预先计算或将数据集分布在多个系统中......

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

【讨论】:

    猜你喜欢
    • 2014-07-22
    • 1970-01-01
    • 2020-02-26
    • 2021-09-13
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    相关资源
    最近更新 更多