python - APSW(或 SQLite3)在 executemany 上插入非常慢

标签 python sqlite apsw

我在插入行时发现 APSW(Python 的 SQLite 解析器)存在以下问题。

假设我的数据是 data = [[1,2],[3,4]]

APSW 和 SQLite3 允许我做类似的事情:

apsw.executemany("INSERT INTO Table VALUES(?,?)", b)

或者我可以编写一些代码来执行以下操作:

sql = "BEGIN TRANSACTION; 
INSERT INTO Table Values('1','2');
INERT INTO Table Values('3','4');
COMMINT;"

apsw.execute(sql)

data 是一个长列表/数组/表时,第一种方法的性能与第二种方法相比非常慢(对于 400 行,它可能是 20 秒而不是 1 秒!)。我不明白为什么会这样,因为这是所有 SQLite Python 教程中显示的将数据添加到表中的方法。

知道这里会发生什么吗?

最佳答案

(披露:我是 APSW 的作者)。如果你没有明确地让一个事务生效,那么 SQLite 会自动在每个语句的开头启动一个事务,并在每个语句的末尾结束。写入事务是持久的——这意味着内容必须最终存储在存储中并调用 fsync 以确保它们能够在意外的电源或系统故障中幸存下来。存储速度慢!

我建议在您的情况下使用 with 而不是 BEGIN/COMMIT,因为它会在出错时自动回滚。这可确保您的数据插入完全发生或根本不发生。参见 the documentation举个例子。

当你插入大量数据时,你会发现WAL mode性能更高。

关于python - APSW(或 SQLite3)在 executemany 上插入非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35013453/

相关文章:

android - 在android中保存到本地数据库和Firebase

python - 将从第一个表获取的行值与第二个表的列名匹配,无需循环

python - 将 SQLite 与 APSW 结合使用时为 "BusyError: cannot rollback savepoint - SQL statements in progress"

python - 在 python 2.7 中更新 openssl

python - float32 和 float64 的真正区别

python - 将峰度应用于 python 中的分布

database - 我如何在 SQLite 中组织这样的数据库?

mysql - 从 SQlite 中选择使用 EPOCH 时间的过去 24 小时

Python 导入 matplotlib.pyplot 不起作用

python - 如何在数据库中的表本身上创建索引?