我有一个sqlite数据库(appr。11gb),包含多个表,包括表distance
和vertices
。表distance
非常大(120万行),vertices
较小(15 000行)。我想在python中使用sqlite3通过vertices
中另一列的值更新distance
的一列。表顶点在cat
列上有一个索引,在orig_cat
列上有一个索引。
我在做什么:
import sqlite3
db_path='path/to/db.db'
conn = sqlite3.connect(db_path)
cur = conn.cursor()
cur.execute('''UPDATE distance SET
from_orig_v = (SELECT orig_cat FROM vertices WHERE cat=distance.source)''')
然而,在如此大的数据库上运行该update语句会导致内存错误。内存使用量稳步增加,直到崩溃。我正在寻找建议,以执行这样一个大的更新语句,而不会耗尽内存?也许在块中处理更新(即distance
表的行)并在例如1000次更新后提交到空闲内存?如何在python/sqlite中完成?
应该可以用这样的语句来更新数据块:
UPDATE distance SET ... WHERE rowid BETWEEN 100000 AND 200000;
你不需要使用多个事务;实际上必须在内存中保存的唯一东西是要在单个语句中更新的行列表。(理论上,当内存耗尽时,您应该得到一个适当的错误消息。在实践中,一些操作系统会过度使用内存,并且直到为时已晚才告诉应用程序。