【发布时间】: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