楼主: 马甲1号
4638 2

[学习分享] 转自stackoverlow-如何提高RSQLite的写入速度 [推广有奖]

  • 3关注
  • 3粉丝

已卖:21份资源

副教授

21%

还不是VIP/贵宾

-

威望
0
论坛币
1948 个
通用积分
8.7693
学术水平
159 点
热心指数
165 点
信用等级
144 点
经验
6203 点
帖子
754
精华
0
在线时间
666 小时
注册时间
2010-10-24
最后登录
2024-7-17

楼主
马甲1号 发表于 2014-6-3 22:33:42 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
经常用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秒不到了.

  1. > library(RSQLite)
  2. Loading required package: DBI
  3. > conn=dbConnect('SQLite', tempfile())
  4. > n_data=1000
  5. > DB=data.frame(n=1:n_data, a=runif(n_data), b=runif(n_data))
  6. > system.time(dbWriteTable(conn, 'DB',DB)) #第一次写入, 时间忽略不计
  7.    user  system elapsed
  8.    0.01    0.00    0.07
  9. > dbSendQuery(conn, 'delete from DB')
  10. <SQLiteResult: DBI RES (5660, 0, 6)>
  11. > system.time(dbWriteTable(conn, 'DB',DB, append=T)) #删掉后第二次写入, 时间非常慢, 需要200秒
  12.    user  system elapsed
  13.    0.14    2.08  199.34
  14. > dbSendQuery(conn, 'delete from DB')
  15. <SQLiteResult: DBI RES (5660, 0, 10)>
  16. > chunks=100
  17. > starts.stops <- floor( seq( 1 , nrow( DB ) , length.out = chunks ) )
  18. > system.time({
  19. +     for ( i in 2:( length( starts.stops ) )  ){
  20. +         if ( i == 2 ){
  21. +             rows.to.add <- ( starts.stops[ i - 1 ] ):( starts.stops[ i ] )
  22. +         } else {
  23. +             rows.to.add <- ( starts.stops[ i - 1 ] + 1 ):( starts.stops[ i ] )
  24. +         }
  25. +         dbWriteTable( conn , 'DB' , DB[ rows.to.add , ] , append = TRUE )
  26. +     }
  27. + }) #按照老外的分块写入法, 只要3秒不到, 比大批量append要快60-70倍
  28.    user  system elapsed
  29.    0.46    0.06    2.91
  30. > dbDisconnect(conn)
  31. [1] TRUE
  32. >
复制代码



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:sqlite stack 如何提高 Over LITE 如何

归欤!归欤!吾党之小子狂简,斐然成章,不知所以裁之。

沙发
complicated 在职认证  发表于 2014-6-4 11:10:38
好帖子,分块不光在SQLITE这里适用,在用RODBC跟其他数据库交互的时候也适用。
密码被盗??

藤椅
duanqs 发表于 2015-9-14 22:24:01
相当于批量事务操作, 大大地减少了对盘文件的访问次数,  肯定效率高多了.
begin commit
   write data  to  DB_table
end commit

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 08:49