【问题标题】:Bulk-Update an SQLite column in R using RSQLite and bind.data使用 RSQLite 和 bind.data 批量更新 R 中的 SQLite 列
【发布时间】:2015-07-20 18:09:30
【问题描述】:

我将 R 与 SQLite 结合使用,使用 RSQLite 来持久化我的数据,因为我没有足够的 RAM 来不断存储所有列并使用它们进行计算。我使用以下方法向 SQLite 数据库添加了一个空列:

dbGetQuery(db, "alter table test_table add column newcol real)

现在我想使用我在 R 中计算并存储在我的 data.table 列 dtab$newcol 中的数据来填充此列。我尝试了以下方法:

dbGetQuery(db, "update test_table set newcol = ? where id = ?", bind.data = data.frame(transactions$sum_year, transactions$id))

不幸的是,R 似乎在做某事,但没有使用任何 CPU 时间或 RAM 分配。数据库不会改变大小,即使 24 小时后也没有任何改变。因此,我认为它已经崩溃了——没有任何输出。

我是否使用了错误的更新语句?有没有其他方法可以做到这一点?

更新

我还尝试了 RSQLite 函数 dbSendQuery 和 dbGetPreparedQuery - 两者的结果相同。但是,有效的是在不使用 bind.data 的情况下更新单行。因此,更新列的循环似乎是可能的,但由于数据集很大,我将不得不评估性能。

【问题讨论】:

  • 你试过dbSendQuery吗?
  • 不好意思忘了提,也试过dbSendquery和dbGetPreparedQuery。
  • 您使用了参数化查询,请确保您的 RSQLite 版本支持它们,因为这是 RSQLite 中的最新功能。如果不是这种情况,则尝试在没有参数化查询的情况下执行更新。如果这无助于从上一步中获取更新语句并检查它们是否可以直接在 sqlite 上工作,而不是来自 R。
  • 您是否在id 上设置了索引? sqlite 索引,而不是 data.table 之一。没有索引的 SQLite 可能真的很慢。
  • 确实,问题与 SQLite 性能有关。我禁用了同步并将 journal_mode 设置为关闭。我还更改了我的 RSQLite 代码以使用 dbBegin()、dbSendPreparedQuery() 和 dbCommit()。这需要一段时间,但至少它不起作用并且具有可接受的性能:-) 谢谢@jangorecki

标签: r sqlite data.table rsqlite


【解决方案1】:

正如@jangorecki 所提到的,问题与 SQLite 性能有关。我禁用了同步并将 journal_mode 设置为 off(每次会话都必须这样做)。

dbGetQuery(transDB, "PRAGMA synchronous = OFF") 
dbGetQuery(transDB, "PRAGMA journal_mode = OFF")

我还更改了我的 RSQLite 代码以使用 dbBegin()dbSendPreparedQuery()dbCommit()。这需要一段时间,但至少它不起作用并且具有可接受的性能。

【讨论】:

  • 您介意发布您为此使用的完整 R 代码,以及您在此处提到的更改吗?谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多