为什么在具有相同硬件的不同机器上读取sqlite数据库的速度较慢?

时间:2011-07-23 15:05:34

标签: python performance sqlite neural-network

好吧,所以我观察到一些我肯定会称之为'意外'的行为,而且我很好奇是否有人可以提供和了解到底是怎么回事。我会尽量保持简洁......

我有一个sqlite数据库,我正在访问Python(150k行,11个表),用于神经网络训练。结束是无关紧要的,但这意味着我的数据点存储在一个表中作为相当大的blob而DB是大约5GB。因为我只拉动某些行(由于交叉验证或其他类型的过滤),我发现在某些有意义的列上建立索引会导致速度显着增加。当阳光明媚时,我可以在大约2秒内选择,获取并格式化大约500个数据点。这很棒。

然而,任何熟悉神经网络/ backprop / SGD的人都可以证明,这个过程可以 - 取决于数据和架构 - 永远。为了实现最佳的并行化,我已经申请了多台机器(Mac Pro,8GB RAM,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 个答案:

答案 0 :(得分:2)

如果您没有使用auto_vacuum = FULL运行数据库,则可能是数据库文件中的数据结构存在碎片。您是否尝试在数据库上运行VACUUM

答案 1 :(得分:0)

文件系统本身是否也配置相同?

ext3确实片段化了:superuser fragmentation