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

2024-01-30

插入行时,我发现 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)

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

知道这里可能发生什么吗?


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

我建议使用with而不是在您的情况下开始/提交,因为它会在错误时自动回滚。这可以确保您的数据插入要么完全发生,要么根本不发生。看文档 https://rogerbinns.github.io/apsw/connection.html#apsw.Connection.__enter__举个例子。

当你插入大量数据时,你会发现WAL mode https://rogerbinns.github.io/apsw/tips.html#write-ahead-logging变得更加高效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

APSW(或 SQLite3)在executemany 上插入非常慢 的相关文章

随机推荐