转自stackoverlow-如何提高RSQLite的写入速度

经常用RSQLite写数据的朋友会发现RSQLite一次性写入大量数据奇慢无比, 并且一直在读硬盘, 导致其他操作也被拖累, 据说这是由于sqlite基于事物所导致的. 这种情况特别容易发生在对表格增量写入的情况. 
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
> 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值