python - 为 20,000 多个更新优化 Sqlite3

标签 python performance optimization sqlite

我有大约 20,000 个项目的列表,我想将它们插入到一个表中(其中大约有 50,000 行)。这些项目中的大多数会更新现有行中的某些字段,少数项目会插入全新的行。

我为每个项目访问数据库两次。首先是检查该行是否存在的选择查询。接下来,我根据选择查询的结果插入或更新一行。我在更新/插入后立即提交每个事务。

对于前几千个条目,我每秒处理大约 3 或 4 个项目,然后它开始变慢。到最后,每次迭代花费的时间超过 1/2 秒。为什么它会放慢速度?

我的平均时间是:整个运行 0.5 秒,每个选择查询 0.18 秒,每个插入/更新 0.31 秒。最后的 0.01 是由于在进入数据库之前解析数据的几个未测量的过程。

更新

我已将所有提交作为测试注释掉,但没有任何变化,所以不是这样(不过,欢迎任何关于最佳提交的更多想法)。

关于表结构: 每行有二十列。前 4 个是 TEXT 字段(都是用第一个 insert 设置的),后 16 个是 REAL 字段,其中一个是用初始 insert 语句输入的。

随着时间的推移,“未完成”的 REAL 字段将填充我在此尝试优化的流程。

我没有明确的索引,尽管其中一个字段是每一行的唯一键。

我应该注意到,随着数据库变得越来越大,SELECT 和 UPDATE 查询都花费了越来越多的时间,SELECT 操作的性能下降尤为显着。

我最初认为这可能是 SQLITE 的某种结构性问题(无论那是什么意思),但一直无法在任何地方找到任何表明该程序存在自然限制的文档。

数据库现在大约有 60 兆字节。

最佳答案

我认为你的瓶颈是你每次插入/更新时都要提交/avec:

I commit each transaction right after the update/insert.

要么停止这样做,要么至少切换到 WAL journaling ;看到我的这个答案为什么: SQL Server CE 4.0 performance comparison

如果您有一个主键,您可以通过使用带有 INSERT INTO 的 ON CONFLICT 子句来优化选择:

http://www.sqlite.org/lang_conflict.html

编辑:早些时候我打算写“如果你有一个主键”而不是外键;我修好了。

关于python - 为 20,000 多个更新优化 Sqlite3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6711357/

相关文章:

javascript - 优化交互式 SVG JavaScript 动画

r - 如何从给定的起点在 R 中进行爬山?

python - 为什么 Python 文档说我在定义 __eq__ 时需要定义 __ne__?

c# - 读访问后内存映射文件值设置为零

带有 MySQL 数据库的 Python 3.4.0

mysql - 选择前100行后如何停止或限制选择?

python - "a bytes-like object is required",但 type(var) 返回 <class 'bytes' >

python - 提高for循环效率

c++ - 对大 vector 进行计时数值运算。如何进行公平比较?

javascript - 页面速度优化: writing to DOM using javascript vs. html