以块的形式更新大型sqlite数据库

时间:2016-09-08 14:06:08

标签: python memory sqlite sql-update

我有一个sqlite数据库(大约11 GB),它有多个表,包括表distancevertices。表distance非常大(120 mio行),vertices较小(15 000行)。我想在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)''')

但是,在这样大的数据库上运行该更新语句会导致内存错误。内存使用量稳步增加,直至崩溃。我正在寻找建议执行如此大的更新语句,而不会耗尽内存?也许以块的形式处理更新(即distance表的行)并在例如...之后提交。 1000个免费内存更新?怎么会在python / sqlite中完成?

1 个答案:

答案 0 :(得分:2)

应该可以使用以下语句更新块:

UPDATE distance SET ... WHERE rowid BETWEEN 100000 AND 200000;

您不需要使用多个交易;实际上必须保留在内存中的唯一事情是要在单个语句中更新的行列表。 (理论上,当内存耗尽时,你应该得到一个适当的错误信息。在实践中,一些操作系统overcommit memory并且直到它为时已晚才告诉应用程序。)