为什么在相同硬件的不同机器上读取sqlite数据库更慢?
好吧,我遇到了一些我称之为“意外”的情况,我很好奇有没有人能给我一些见解,看看到底发生了什么。我会尽量简明扼要……
我有一个sqlite数据库,使用Python访问(有15万行,11个表),目的是为了训练神经网络。具体的目的不重要,但这意味着我的数据点存储在一个表里,作为相当大的数据块,数据库大约有5GB。因为我只提取某些行(由于交叉验证或其他类型的过滤),我发现对某些重要列建立索引可以显著提高速度。当一切顺利时,我可以在大约2秒内选择、获取和格式化大约500个数据点。这太棒了。
然而,任何熟悉神经网络、反向传播和随机梯度下降的人都知道,这个过程可能会根据数据和架构的不同而耗费很长时间。为了更好地并行处理,我使用了多台机器(Mac Pro,8GB内存,16个核心,速度不详)在不同的条件下启动训练场景,使用不同的线程。由于内存限制,最多只能有6到7个线程同时访问同一个数据库文件。根据我所知,这些机器是相同的。
事情变得奇怪了。起初,我的基准机器性能很好,线程数量的增加并没有减慢速度(一个线程和七个线程的速度基本相同)。当我第一次将这个数据库文件复制到其他机器上(并重新创建索引)时,有一台机器的速度和我的基准机器一样快,但另一台却慢了大约一倍。我当时以为这是硬件差异,便继续我的生活。然后,在修改了sqlite数据库并重新复制到所有机器后,之前慢的那台机器现在变快了,而其他机器的性能却变慢了——包括基准机器。
我搞不懂。我对所有实例做了相同的操作。数据库文件在复制时是相同的,然后我删除/创建了相同的索引,因为我很确定sqlite索引是指向磁盘上的绝对位置。我在unix环境下,所以文件碎片不应该是罪魁祸首(对吧?)。在某些配置中并发似乎不是问题,而其他配置则出现了瓶颈。我检查过,机器在纸面上确实是相同的。而对我来说最困惑的是,同一台机器的性能在不同配置下也有差异。
我真的很困惑。任何方向上的建议都将不胜感激。我对关系数据库编程并不精通,但此时我已经没有更多的想法了。
更新:我可能“解决”了我的问题,但这个问题并没有得到解答。我发现如果我基本上在每个系统上重启数据库文件,最终可以让各台机器的性能相等。这个过程大致是……
while unhappy:
1. Drop all indexes
2. Create new indexes
3. Make a handful of select/fetch calls
4. Commit / quit / restart
过了一段时间,似乎性能会稳定在一个令人满意的水平。但我不知道为什么。
2 个回答
文件系统本身的配置也是一样的吗?
而且,ext3确实会出现碎片化的问题:超级用户的碎片化讨论
如果你的数据库没有设置为自动清理(auto_vacuum=FULL),那么可能会出现数据结构碎片的问题,也就是数据库文件里的数据变得不整齐。你有没有尝试过在你的数据库上运行一下VACUUM命令呢?