2015-07-20 19 views
2

我使用R與SQLite結合使用RSQLite來持久化我的數據,因爲我沒有足夠的RAM來持續存儲所有列並使用它們進行計算。我添加一個空列使用SQLite數據庫:使用RSQLite和bind.data批量更新R中的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小時後沒有任何變化。因此,我認爲它已經崩潰 - 沒有任何輸出。

我使用update語句錯誤嗎?有沒有其他的方法來做到這一點?

UPDATE

我也曾嘗試RSQLite功能dbSendQuery和dbGetPreparedQuery - 都具有相同的結果。但是,沒有使用bind.data就可以更新單行。因此,更新列的循環似乎是可能的,但是由於數據集很大,我將不得不評估性能。

+1

你試過'dbSendQuery'嗎? – jangorecki

+0

對不起忘了提,還試過dbSendquery和dbGetPreparedQuery。 – shatala

+0

您使用了參數化查詢,確保您的RSQLite版本支持它們,因爲這是RSQLite中最新的功能。 如果不是這種情況,請嘗試在沒有參數化查詢的情況下執行更新。如果這無助於獲取上一步中的更新語句,並檢查它們是否將直接在sqlite上工作,而不是從R. – jangorecki

回答

2

正如@jangorecki提到的那樣,問題與SQLite性能有關。我禁用同步並將journal_mode設置爲關閉(必須爲每個會話完成)。

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

此外,我改變了我的RSQLite代碼使用dbBegin()dbSendPreparedQuery()dbCommit()。這需要一段時間,但至少它不起作用,並且具有可接受的性能。

+0

您是否介意發佈您用於此的完整R代碼,以及您在此提及的更改?謝謝。 – user5359531