python - 分块更新大型 SQLite 数据库

标签 python memory sqlite sql-update

我有一个 sqlite 数据库(约 11 GB),其中包含多个表,包括表 distancevertices。表 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/

相关文章:

sqlite - 如何在expo React Native中使用sqlite文件

python - 试图在两个日期列之间进行区分

python - reshape ,重新组合行与列

swift - 使用大量 UIImage 时出现内存问题

python - 缓冲区错误 : could not get scalar buffer information

mysql - 是否有像 mySQL 这样的 SQLite 行大小限制

Python - 将字符串拆分为多列

python - 从 Pandas 的一系列线条中制作列

iphone - webView 中的简单视频和内存消耗

database - R:是否有更快的方法将大数据框中的列从字符转换为 POSIXct 日期时间?