我有一个sqlite数据库(大约11 GB),其中有多个表,包括表distance
和vertices
。该表distance
非常大(120 mio行),vertices
较小(15000行)。我想在python中使用sqlite3来distance
按中的另一列的值更新一列vertices
。表顶点在列上有一个索引,在上有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;
您无需使用多个事务;实际上必须保留在内存中的唯一一件事就是在单个语句中要更新的行的列表。(从理论上讲,当内存用尽时,您应该收到一条适当的错误消息。实际上,某些操作系统会过度使用内存,并且直到为时已晚才告诉应用程序。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句