4

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

4

1 回答 1

2

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

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

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

于 2015-07-20T21:03:37.080 回答