2013-03-13 31 views
1

我有這個簡單的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 

時間來完成數據寫入到數據庫中。顯然,我在不知道它的情況下觸及了內存限制。

+3

我剛剛寫了一個1e6 x 10數據框到R的SQLite表,它花了7秒。你可以在你的數據上共享'str()'的輸出嗎?你能提供一些關於你電腦的更多細節嗎? – joran 2013-03-13 16:22:46

+1

你能寫一小部分數據到這個表(例如'head(DB)')嗎? – 2013-03-13 16:30:04

+0

如果您嘗試寫入新的表格3,然後刪除表格2,會發生什麼情況? – Tim 2013-03-13 17:10:31

回答

0

對所有記錄使用單個事務(提交)。添加

dbSendQuery(con, "BEGIN") 
插入前

dbSendQuery(con, "END") 

完成。快多了。

相關問題