【发布时间】: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