当前位置: 首页 > 工具软件 > rsqlite3 > 使用案例 >

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

丰俊艾
2023-12-01
经常用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
> 

 类似资料: