http://stackoverflow.com/questions/15390565/rsqlite-takes-hours-to-write-table-to-sqlite-database
老外的解决方式很简单, 将大批量数据均分成100份, 速度大幅提高.
实测结果如下, 可见分块写入可以大幅提高append的速度. 对现有表插入1000行数据, 直接dbWriteTable需要200秒, 分成100块dbWriteTable就只要3秒不到了.
- > library(RSQLite)
- Loading required package: DBI
- > conn=dbConnect('SQLite', tempfile())
- > n_data=1000
- > DB=data.frame(n=1:n_data, a=runif(n_data), b=runif(n_data))
- > system.time(dbWriteTable(conn, 'DB',DB)) #第一次写入, 时间忽略不计
- user system elapsed
- 0.01 0.00 0.07
- > dbSendQuery(conn, 'delete from DB')
- <SQLiteResult: DBI RES (5660, 0, 6)>
- > system.time(dbWriteTable(conn, 'DB',DB, append=T)) #删掉后第二次写入, 时间非常慢, 需要200秒
- user system elapsed
- 0.14 2.08 199.34
- > dbSendQuery(conn, 'delete from DB')
- <SQLiteResult: DBI RES (5660, 0, 10)>
- > 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( conn , 'DB' , DB[ rows.to.add , ] , append = TRUE )
- + }
- + }) #按照老外的分块写入法, 只要3秒不到, 比大批量append要快60-70倍
- user system elapsed
- 0.46 0.06 2.91
- > dbDisconnect(conn)
- [1] TRUE
- >


雷达卡



京公网安备 11010802022788号







