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

时间:2015-07-20 18:09:31

标签: r sqlite data.table rsqlite

我正在使用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的情况下更新单行的工作原理是什么。因此,更新列的循环似乎是可能的,但我必须评估性能,因为数据集很大。

1 个答案:

答案 0 :(得分:2)

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

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

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