如何诊断访问sqlite数据库缓慢的原因?
2 个回答
0
我可以分享一下我在类似情况下的经验,不过是用不同的平台,也就是J。
当时遇到了一些慢的问题,我发现是因为sqlite3_get_table
这个函数。这个函数会返回每一列的指针,每个指针指向一个指针数组,而这些指针又指向一个以空字符结束的字符串。如果函数的结果是空的,指针也会是空的(比如在一个空的数据集中求最大值时,它会返回一个空指针,而不是指向空的指针。我对此很不喜欢。)然后,J会把这些地址整理成可读的格式(形成一个大的地址矩阵,后面跟着0表示偏移量,-1表示长度,也就是到第一个空字符为止),然后逐个处理,最终把表格整理成想要的列和行。
所以,从SQLite获取数据到另一个平台时,涉及到内存传输和实际读取的数据处理。我发现这个通常很大的数据集在J中处理起来并不容易,导致字符串处理起来很笨重。而且还有那个讨厌的空指针问题。
我能够限制矩阵的修改,从而优化这个函数。最终的优化是使用读取内存地址的原始代码(15!:1
),而不是一个好听名字的函数(memr
),因为使用memr意味着J在每次读取内存时都要解释memr
的意思。
总之,如果Python允许一些修改,也许你可以调整数据库的访问方式,以更好地满足你的需求。希望这能帮到你,不过我并不抱太大希望……
1
如果你可能忽略了这一点,请确保你正在使用最新版本的pysqlite2数据库适配器和sqlite3库。链接中的回答还展示了如何准确确定你正在使用的每个版本的信息,这些信息你可能想要添加到你的问题中。