我有一个 sqlite 数据库(约 11 GB),其中包含多个表,包括表 distance
和 vertices
。表 distance
相当大(120 mio 行),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)''')
但是,在如此大的数据库上运行该更新语句会导致内存错误。内存使用量稳步增加,直到崩溃。我正在寻找执行如此大的更新语句而不会耗尽内存的建议?也许以 block 的形式处理更新(即 distance
表的行)并在例如之后提交更新1000次可以释放内存吗?在 python/sqlite 中如何做到这一点?
最佳答案
应该可以使用如下语句更新 block :
UPDATE distance SET ... WHERE rowid BETWEEN 100000 AND 200000;
您不需要使用多个事务;实际上必须保留在内存中的唯一内容是要在单个语句中更新的行列表。 (理论上,当内存耗尽时,您应该收到适当的错误消息。实际上,某些操作系统 overcommit memory 并且不会告诉应用程序,直到为时已晚。)
关于python - 分块更新大型 SQLite 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39393095/