【问题标题】:SQLite select speed varies in Python?SQLite 选择速度在 Python 中有所不同?
【发布时间】:2014-07-29 18:18:55
【问题描述】:

我对 SQLite 数据库(磁盘上 1.5GB)有一个简单的查询。看来我的循环很慢

for id, data in conn.execute("select ID, val in data order by ID"):
     # do stuff

尽管 ID 列上有索引。 但是当我重新启动脚本时,之前运行中读取的行以可接受的速度循环。它们是否以某种方式被缓存?

我可以做些什么来快速循环完整的数据?

编辑: 显然 orderby/index 是问题所在。在有和没有 order by 的情况下循环遍历行之间有 2000 倍的速度差异。

Pragma table_info(data) 显示

ID: cid=0 type=int notnull=0 dflt_value=null pk=0
val: cid=1 type=int notnull=0 dflt_value=null pk=0

我没有对任何东西进行特殊调整。

VACUUM 没有提高性能。

我的索引是:

type=index, tbl_name=data rootpage=3 sql=create index myindex on data (ID)

已解决:创建一个覆盖索引 (id, val) 然后循环会快很多。其他调整都没有成功...

【问题讨论】:

  • 您可以将表和索引的架构添加到您的问题中吗?它可能会帮助人们给出准确的答案。如果您不确定如何执行此操作,stackoverflow.com/questions/4654762/… 可能会有所帮助。
  • 从本地磁盘复制一个 1.5GB 的文件到本地磁盘需要几分钟?如果您使用的不是软盘或一台太旧以至于无法在其上运行 Win7 的计算机,那么这似乎 非常 很慢。我刚刚在一台 2005 年的老式机器上复制了 5GB,花了 30 秒。
  • 可能是因为文件在网络驱动器上。可以肯定的是,我现在正在本地驱动器上工作。无论如何,没有order by 的阅读速度是可以接受的。 order by 对未缓存数据的大规模减速太慢了。

标签: python sqlite


【解决方案1】:

您的操作系统缓存读取数据;如果您的硬盘速度较慢,则初始读取将比后续运行慢。

您可以采取一些措施来加快速度:

  • 运行VACUUM 来重建数据库文件;碎片和空白空间会影响数据的读取方式。

  • 使用pragma cache_size = <page count> 调整页面缓存大小。默认为 2000 页;如果您有内存,请尝试将其设置为更高的值。

【讨论】:

  • 那么我对 SQLite 无能为力吗?在 Windows 7 中我可以做什么(没有管理员权限)?
  • @Gerenuk:你无法回避硬盘是一种慢介质的事实;这就是为什么您的操作系统在读取数据后使用缓冲区来缓存数据。
  • 复制整个文件需要几分钟时间。仅仅用我的脚本阅读整个文件就需要几天时间。我有什么办法吗?
  • 顺便说一句,在没有索引的情况下读取整个文件又快了。所以磁盘访问和索引肯定有问题。
  • @Gerenuk:这张桌子是不是改了很多?也许您需要运行 VACUUM 来清除任何碎片问题。
猜你喜欢
  • 1970-01-01
  • 2012-11-25
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
相关资源
最近更新 更多