我正在使用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的情况下更新单行的工作原理是什么。因此,更新列的循环似乎是可能的,但我必须评估性能,因为数据集很大。
答案 0 :(得分:2)
如@jangorecki所述,问题与SQLite性能有关。我禁用了synchronous并将journal_mode设置为off(必须为每个会话完成)。
dbGetQuery(transDB, "PRAGMA synchronous = OFF")
dbGetQuery(transDB, "PRAGMA journal_mode = OFF")
此外,我将我的RSQLite代码更改为使用dbBegin()
,dbSendPreparedQuery()
和dbCommit()
。这需要一段时间,但至少它不起作用并具有可接受的性能。