如何诊断访问sqlite数据库缓慢的原因?

2 投票
2 回答
1414 浏览
提问于 2025-04-16 04:51

我之前在这个问题中提到过,我在用Python访问sqlite数据库时遇到了性能问题。为了更清楚地说明这一点,使用apsw的相同代码运行速度比其他方式快了20倍以上。最近我在电脑上安装了一个不同版本的Python,并为这个版本安装了新的apsw,但这个版本的运行速度也很慢。我还在另一台电脑上用Python自带的sqlite3运行了相同的代码,结果运行得很快(但用apsw时却很慢)。我也尝试在我的电脑上安装最新版本的pysqlite,但运行速度依然很慢。

我非常确定问题不在于数据库的结构。

我现在的问题是,接下来我该如何诊断这个错误呢?

2 个回答

0

我可以分享一下我在类似情况下的经验,不过是用不同的平台,也就是J。

当时遇到了一些慢的问题,我发现是因为sqlite3_get_table这个函数。这个函数会返回每一列的指针,每个指针指向一个指针数组,而这些指针又指向一个以空字符结束的字符串。如果函数的结果是空的,指针也会是空的(比如在一个空的数据集中求最大值时,它会返回一个空指针,而不是指向空的指针。我对此很不喜欢。)然后,J会把这些地址整理成可读的格式(形成一个大的地址矩阵,后面跟着0表示偏移量,-1表示长度,也就是到第一个空字符为止),然后逐个处理,最终把表格整理成想要的列和行。

所以,从SQLite获取数据到另一个平台时,涉及到内存传输和实际读取的数据处理。我发现这个通常很大的数据集在J中处理起来并不容易,导致字符串处理起来很笨重。而且还有那个讨厌的空指针问题。

我能够限制矩阵的修改,从而优化这个函数。最终的优化是使用读取内存地址的原始代码(15!:1),而不是一个好听名字的函数(memr),因为使用memr意味着J在每次读取内存时都要解释memr的意思。

总之,如果Python允许一些修改,也许你可以调整数据库的访问方式,以更好地满足你的需求。希望这能帮到你,不过我并不抱太大希望……

1

如果你可能忽略了这一点,请确保你正在使用最新版本的pysqlite2数据库适配器和sqlite3库。链接中的回答还展示了如何准确确定你正在使用的每个版本的信息,这些信息你可能想要添加到你的问题中。

撰写回答