Rsqlite需要几个小时才能将表写入sqlite数据库

时间:2013-03-13 16:10:29

标签: r sqlite

我有这个简单的R程序,它从sqlite数据库中读取一个表(1000000行,10列)到R data.table然后我对数据做一些操作并尝试将其写回到新的表中相同的sqlite数据库。读取数据需要几秒钟,但将表格写回sqlite数据库需要几个小时。我不知道到底有多长时间,因为它从未完成,我试过的最长时间是8小时。

这是该计划的简化版本:

  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)

我使用R版本2.15.2,包版本是:

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 

完成将数据写入数据库的时间。显然我在不知情的情况下达到了内存限制。

1 个答案:

答案 0 :(得分:0)

对所有记录使用单个事务(提交)。添加

dbSendQuery(con, "BEGIN")
在插入之前

dbSendQuery(con, "END")

完成。快得多。