我有這個簡單的R程序,它將sqlite數據庫中的表(1000000行,10列)讀入R data.table,然後對數據執行一些操作並嘗試把它寫回到同一個sqlite數據庫的新表中。讀取數據需要幾秒鐘,但將表寫回到sqlite數據庫需要數小時。我不知道多久,因爲它從來沒有完成,我試過的最長時間是8小時。Rsqlite需要花費數小時才能將表寫入sqlite數據庫
這是該方案的簡化版本:,使用R版本2.15.2
library(DBI)
library(RSQLite)
library(data.table)
driver = dbDriver("SQLite")
con = dbConnect(driver, dbname = "C:/Database/DB.db")
DB <- data.table(dbGetQuery(con, "SELECT * from Table1"))
dbSendQuery(con, "DROP TABLE IF EXISTS Table2")
dbWriteTable(con, "Table2", DB)
dbDisconnect(con)
dbUnloadDriver(driver)
IM,包版本是:
data.table_1.8.6 RSQLite_0.11.2 DBI_0.2-5
我已經嘗試過多個系統和不同的Windows版本,並且在所有情況下都需要花費大量的時間將此表寫入sqlite數據庫。在查看sqlite數據庫的文件大小時,它的寫入速度約爲每分鐘50KB。
我的問題是有人知道是什麼導致這種慢寫速度?
蒂姆有答案,但我不能這樣標記它,因爲它在評論中。
如: ideas to avoid hitting memory limit when using dbWriteTable to save an R data table inside a SQLite database 我寫的數據到數據庫中的數據塊
chunks <- 100
starts.stops <- floor(seq(1 , nrow(DB) , length.out = chunks))
system.time({
for (i in 2:(length(starts.stops)) ){
if (i == 2){
rows.to.add <- (starts.stops[ i - 1 ]):(starts.stops[ i ])
} else {
rows.to.add <- (starts.stops[ i - 1 ] + 1):(starts.stops[ i ])
}
dbWriteTable(con , 'Table2' , DB[ rows.to.add , ] , append = TRUE)
}
})
這需要:
user system elapsed
4.49 9.90 214.26
時間來完成數據寫入到數據庫中。顯然,我在不知道它的情況下觸及了內存限制。
我剛剛寫了一個1e6 x 10數據框到R的SQLite表,它花了7秒。你可以在你的數據上共享'str()'的輸出嗎?你能提供一些關於你電腦的更多細節嗎? – joran 2013-03-13 16:22:46
你能寫一小部分數據到這個表(例如'head(DB)')嗎? – 2013-03-13 16:30:04
如果您嘗試寫入新的表格3,然後刪除表格2,會發生什麼情況? – Tim 2013-03-13 17:10:31