使用 RSQLite 和 bind.data 批量更新 R 中的 SQLite 列

Bulk-Update an SQLite column in R using RSQLite and bind.data

我将 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 的情况下更新单行。因此,更新列的循环似乎是可能的,但由于数据集很大,我将不得不评估性能。

如@jangorecki 所述,问题与 SQLite 性能有关。我禁用了同步并将 journal_mode 设置为关闭(必须为每个会话完成)。

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

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