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

时间:2010-10-01 19:02:48

标签: python performance sqlite

正如我前段时间在this问题中所述,我在从Python访问sqlite数据库时遇到了性能问题。为了再次明确这一点,使用apsw相同的代码运行速度提高了20多倍。我最近并行安装了不同版本的Python,并为此安装了新版本的apsw。这个版本运行缓慢。我使用pythons built-int sqlite3在不同的计算机上尝试了相同的代码,并且运行速度很快(但是使用apsw很慢)。我还尝试在我的计算机上安装最新版本的pysqlite,但速度很慢。

我绝对肯定这不是架构的问题。

我现在的问题是,我该如何继续诊断错误?

2 个答案:

答案 0 :(得分:1)

万一您可能忽略了这一点,请确保您正在使用the latest versions of both the pysqlite2 data base adapter and the sqlite3 library。链接的答案还显示了如何准确确定您使用的每个版本,以及您可能想要添加到问题中的数据。

答案 1 :(得分:0)

我可以提供类似经验的经验,但使用不同的平台,即J。

有一些缓慢,我将它指向sqlite3_get_table功能。此函数返回每个列的指针,每个指针指向一个指针数组,其中每个指针都指向一个以空字符结尾的字符串。如果函数的结果为null,则指针也可以为null(例如,空数据集上的Max,它将返回空指针,而不是指向null的指针。我讨厌它。)J然后将地址形成为可读(形成一个大的地址矩阵,后跟0表示偏移量,-1表示长度,表示最多为第一个空值)并循环遍历每个地址,最后在预期的列和行中重新整形表格。

因此,有一个内存传输方面,以及实际读取方面,从SQLite获取数据到另一个平台。我发现J这个常常很大的数据集并不容易处理,这意味着它像所有字符串一样笨重。还有那个令人讨厌的空指针的东西。

我能够限制矩阵修改以优化功能。最后的优化是使用原始代码来读取内存地址(15!:1),而不是正确命名的函数(memr),因为使用memr意味着J必须解释memr的含义每次读取内存时

总之,如果python允许一些修改,也许你可以调整数据库访问以更好地满足你的需求。我希望这会有所帮助,但我没有很大的希望......