我有一个SQLite数据库,其中包含几个表,其中两个表有超过一百万行。我在OSX和SQLite3模块上使用python2.7。你知道吗
我试图用一个SELECT
语句(不带WHERE
或任何类似性质的语句)将表中的所有数据读入内存,使用游标的execute()
方法,然后是它的fetchall()
方法。一个小时后,我决定中断这个过程,因为我不知道它是否崩溃了。因此,我再次尝试使用游标作为迭代器,并告诉它每检索10000行就打印经过的秒数。你知道吗
我发现,虽然这种方法可以在大约6秒钟内检索整个150000行的表,但对于2500000行的表,每10000行需要大约40秒(对于最早的批处理,需要60秒),从第一百万行开始,每10000行需要大约20秒。所以我的问题是:为什么会发生这种情况,有什么好的解决办法或解决办法?一个明显的解决方法是将大型表分解成较小的表(或者完全放弃SQLite而使用其他方法),但这并不是很优雅。你知道吗
关于堆栈溢出的许多其他问题与SQLite中相对复杂的查询(例如SQLite - select expression is very slow)的读性能较慢有关。但是这个问题涉及到最简单的查询类型,例如SELECT a,b,c,d FROM x
。你知道吗
我已经给出了上面使用的操作系统、编程语言和包装器,但我不确定它们与问题有多相关。例如,如果我尝试使用Firefox扩展SQLite Manager检查这些大表,Firefox似乎就挂起了。我也尝试过切换到apsw包装器(https://github.com/rogerbinns/apsw),但是没有任何改进。你知道吗
别那么做。你知道吗
即使由光标介导。你知道吗
在很少的情况下,您实际上需要整个数据库的核心表示,而您的可能不是其中之一。你知道吗
如测试所示,将所有数据拖到内存中是非常昂贵的。执行fetchall的成本是DMBs设计用来处理的主要问题之一。对于任何一个数据库,你都可以建立一个“足够好”的系统。明天它将超过核心。你知道吗
在回复评论时添加:
似乎PyTables is a commonly used tool无法处理破坏内存的数据。我对PyTables没有经验。你知道吗
相关问题 更多 >
编程相关推荐