好吧,所以我观察到一些我肯定会称之为'意外'的行为,而且我很好奇是否有人可以提供和了解到底是怎么回事。我会尽量保持简洁......
我有一个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
过了一会儿,似乎已经满足了。不知道为什么。
答案 0 :(得分:2)
如果您没有使用auto_vacuum = FULL运行数据库,则可能是数据库文件中的数据结构存在碎片。您是否尝试在数据库上运行VACUUM?
答案 1 :(得分:0)
文件系统本身是否也配置相同?
ext3确实片段化了:superuser fragmentation