当前位置: 首页 > 知识库问答 >
问题:

以块为单位更新大型sqlite数据库

容宏逸
2023-03-14

我有一个sqlite数据库(大约11GB),它有多个表,包括表距离顶点。表距离相当大(1.2亿行),顶点较小(15000行)。我想在python中使用sqlite3通过顶点中另一列的值来更新距离中的一列。表格顶点在列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)''')

无论在如此大的数据库上运行该更新语句,都会导致内存错误。内存使用量稳步增加,直到崩溃。我正在寻找建议,以执行如此大的更新语句而不运行内存溢出?也许可以处理块(即<代码>距离 表的行)更新,并在例如1000次更新后提交到空闲内存?在python/sqlite中如何做到这一点?


共有1个答案

白信鸿
2023-03-14

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

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

您不需要使用多个事务;实际上,唯一必须保存在内存中的是要在一条语句中更新的行列表。(理论上,当内存耗尽时,你应该得到一条适当的错误消息。实际上,一些操作系统过度使用内存,直到为时已晚才告诉应用程序。)

 类似资料:
  • 问题内容: 我需要处理一些比RAM大数百倍的数据。我想读一个大块,进行处理,保存结果,释放内存并重复。有没有办法在python中提高效率呢? 问题答案: 常规键是您要迭代处理文件。 如果您只处理文本文件,那么这很简单:一次只能读取一行。(实际上,它可以缓冲所有内容,但是缓冲区足够小,您不必担心。) 如果您要处理其他特定文件类型(例如numpy二进制文件,CSV文件,XML文档等),则通常会有类似的

  • 我是在Android应用程序中使用SQL的新手,并且我在更新使用listView创建的表时遇到了一些麻烦。我设法从listView中更新了一个元素,但它不是正确的元素,它总是列表中的第一个元素发生了变化。 我制作了一个只有一列的表(稍后我将添加更多的两列),下面是我如何构建它: TaskContract_Faltas.java TaskDbHelper_Faltas Faltas.java 我使用

  • 如何使用数据砖增量从其他表中更新表中的多个记录。 我想达到这样的目标: 它失败并出现错误:不匹配的输入“发件人”期望

  • 这是提供用户输入的主活动 } 这是Add_prople类 公共类Add_people扩展AppCompatActivity实现视图。OnClickListener{private EditText name EditText;private EditText ageEditText;private EditText heightEditText;private EditText weightede

  • 主要内容:SQLite 存储类,SQLite 亲和(Affinity)类型,SQLite 亲和类型(Affinity)及类型名称,Boolean 数据类型,Date 与 Time 数据类型SQLite 数据类型是一个用来指定任何对象的数据类型的属性。SQLite 中的每一列,每个变量和表达式都有相关的数据类型。 您可以在创建表的同时使用这些数据类型。SQLite 使用一个更普遍的动态类型系统。在 SQLite 中,值的数据类型与值本身是相关的,而不是与它的容器相关。 SQLite 存储类 每个存

  • 问题内容: 我正在通过Zentus在Java应用程序中使用SQLite。在这种情况下,我需要在数据库中保存和查询Java 值。来自其他RDBMS,我创建了如下表来存储长值: 该解决方案会产生例外的行为,但是在阅读了有关数据类型的SQLite文档之后,我了解到我的类型与使用=> 作为文本存储具有相同的作用。 然后,我决定将其更改为(长度是可变的,并且最多可以存储64位整数,即Java long的长度