"SQLite每行读取时间随总行数增加而增加:解决方法?(Python 2.7,OSX)"

2024-04-26 02:21:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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),但是没有任何改进。你知道吗


Tags: 模块方法数据库sqlite语句firefoxwhereselect
1条回答
网友
1楼 · 发布于 2024-04-26 02:21:15

I tried to read all the data from the tables into memory…

别那么做。你知道吗

即使由光标介导。你知道吗

在很少的情况下,您实际上需要整个数据库的核心表示,而您的可能不是其中之一。你知道吗

如测试所示,将所有数据拖到内存中是非常昂贵的。执行fetchall的成本是DMBs设计用来处理的主要问题之一。对于任何一个数据库,你都可以建立一个“足够好”的系统。明天它将超过核心。你知道吗

在回复评论时添加:

似乎PyTables is a commonly used tool无法处理破坏内存的数据。我对PyTables没有经验。你知道吗

相关问题 更多 >