关闭

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

407人阅读 评论(0) 收藏 举报
分类:
经常用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
> 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:389132次
    • 积分:3889
    • 等级:
    • 排名:第8132名
    • 原创:70篇
    • 转载:124篇
    • 译文:0篇
    • 评论:58条
    最新评论