实测结果如下, 可见分块写入可以大幅提高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
>