【问题标题】:Can I speed up a large data set operation in SQLite / Python?我可以加快 SQLite / Python 中的大型数据集操作吗?
【发布时间】:2014-01-29 11:20:18
【问题描述】:

我有一个大小范围为 1-50 亿“盒子”对象的数据集存储在 SQLite 数据库文件中,格式如下:

[x1,y1,z1,x2,y2,z2,box_id]

目前我在 python 脚本中有一个操作,它执行以下操作:

import sqlite3 as lite

box_data = lite.connect('boxes.db')
cur = box_data.cursor()
editor_cursor = box_data.cursor()

cur.execute("SELECT * FROM boxes")
while True:
    row = cur.fetchone()
    if row == None:
        break

    row_id = row[6]

    x1_normalized = int(round(row[0]/smallest_box_size))
    y1_normalized = int(round(row[1]/smallest_box_size))
    z1_normalized = int(round(row[2]/smallest_box_size))

    x2_normalized = int(round(row[3]/smallest_box_size))
    y2_normalized = int(round(row[4]/smallest_box_size))
    z2_normalized = int(round(row[5]/smallest_box_size))

    editor_cursor.execute("UPDATE boxes SET x1=?,y1=?,z1=?,x2=?,y2=?,z2=? WHERE id=?",(x1_normalized,y1_normalized,z1_normalized,x2_normalized,y2_normalized,z2_normalized,row_id))

“最小盒子尺寸”只是一些浮点数。这是一个简单的归一化任务,基本上每个框坐标必须从其“物理”大小转换为归一化整数坐标。

目前这个过程大约需要几个小时,我想减少这个操作时间。是否有可能在我当前的 python-SQLite 进程中加速这个过程?

有关如何在另一个更快的数据库程序中实现此过程的任何建议也可能会有所帮助:)

【问题讨论】:

  • 这在这里没有帮助,但是将来您可以直接在光标上进行迭代,就像在 for row in cur: 中一样,而无需 fetchone() 和无限的 while 循环。

标签: python sqlite data-processing large-data


【解决方案1】:

让 SQLite 为您完成所有工作:

editor_cursor.execute("""
    UPDATE boxes SET x1=CAST(x1/:smallest_box_size as INTEGER),
                     y1=CAST(y1/:smallest_box_size as INTEGER),
                     z1=CAST(z1/:smallest_box_size as INTEGER),
                     x2=CAST(x2/:smallest_box_size as INTEGER),
                     y2=CAST(y2/:smallest_box_size as INTEGER),
                     z2=CAST(z2/:smallest_box_size as INTEGER)""", 
    {'smallest_box_size': smallest_box_size})

换句话说,SQLite 完全能够为您规范化所有行,而无需通过 Python 将它们全部管道化。

CASTINTEGER 已经将 REAL 值舍入,无需在此处添加显式 round() 调用。

供将来参考:您可以通过遍历游标来遍历结果集。无需为每一行调用.fetchone()

cur.execute("SELECT * FROM boxes")
for row in cur:
    # loop will terminate automatically when the rows are exhausted.

这是非常有效的实现,它只加载需要迭代的结果。

【讨论】:

    猜你喜欢
    • 2020-02-27
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2018-02-07
    • 2021-11-12
    • 2011-03-08
    • 1970-01-01
    相关资源
    最近更新 更多