免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4184 | 回复: 4
打印 上一主题 下一主题

[C] BerkeleyDB中用cursor删除数据的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-14 10:16 |只看该作者 |倒序浏览
20可用积分
最近有个问题比较困扰。在BerkeleyDB中,打开env和db时都指定了DB_AUTO_COMMIT,然后用游标删除数据时没有带DB_TXN,代码如下:

  1. dbp->cursor(dbp, NULL, &cursorp, 0);
复制代码

然后

  1. while ((ret = cursorp->c_get(cursorp, &key, &data, DB_NEXT)) == 0)
  2.     {
  3.         if(判断条件)
  4.         {
  5.             cursorp->c_del(cursorp, 0);
  6.         }
  7.     }
复制代码

这样的代码运行时会有报警信息。似乎是说需要txn。用事务的话效率上似乎吃不消,而且会死锁的样子。不知道谁知道该怎么办?
我的需求是这样的,一个线程不断得往数据库里添加数据,每条记录里带个时间信息。每隔一段时间,起一个线程删除时间超过一定值的数据(也就是删除历史的无用的数据)。不知道谁有好的解决办法?
现在我想到的一个变通的办法是先用游标把需要删除的记录的主键都找出来(保存方法就不限了,也可以放在另一个db里),然后遍历这些主键,删除它们。现在还没有试验这种办法行不行。
第一次使用BerkeleyDb,多多指教。

最佳答案

查看完整内容

删除时,txn参数用NULL应该是可以的。另外bdb数据量的增加对效率的影响很小,反倒时你这种期望的频繁清除历史的操作会对其它操作竞争锁,而且再你每次真正删除一条记录时可能会引起B+树的平衡调整,可以结合删除标记和索引的方法来查询你的有效数据。

论坛徽章:
0
2 [报告]
发表于 2008-11-14 10:16 |只看该作者
删除时,txn参数用NULL应该是可以的。
另外bdb数据量的增加对效率的影响很小,反倒时你这种期望的频繁清除历史的操作会对其它操作竞争锁,而且再你每次真正
删除一条记录时可能会引起B+树的平衡调整,可以结合删除标记和索引的方法来查询你的有效数据。

论坛徽章:
0
3 [报告]
发表于 2008-11-14 10:41 |只看该作者
20分 谢谢 或者先给10分我再说种方案。

论坛徽章:
0
4 [报告]
发表于 2008-11-14 13:23 |只看该作者
原帖由 zhoubug 于 2008-11-14 10:41 发表
20分 谢谢 或者先给10分我再说种方案。

继续说吧。先给你积分了
不过我还没搞明白怎么只给一部分积分,介绍一下啊

论坛徽章:
0
5 [报告]
发表于 2008-11-14 13:29 |只看该作者
原帖由 zhoubug 于 2008-11-14 10:16 发表
删除时,txn参数用NULL应该是可以的。
另外bdb数据量的增加对效率的影响很小,反倒时你这种期望的频繁清除历史的操作会对其它操作竞争锁,而且再你每次真正
删除一条记录时可能会引起B+树的平衡调整,可以结合 ...

我的应用的确需要频繁增删。删除数据并不是因为逻辑上的问题,而是数据量实在太大。
我这边实际上需要的是快速的大量数据的处理。以前我是用公司自己开发的内存数据库(实际上还不是太成熟就是了),我这次是把一个系统迁移到BerkeleyDB上看看效果怎么样。为了速度考虑,必须尽量让数据在cache里运行的样子。倒是这边可用的内存一般都比较大,服务器一般都有16G以上的内存。历史数据是必须清理的,要不然数据量增长非常快,内存和硬盘空间都很难承受。
删除时,txn参数用NULL的确是可以的。但是在游标里txn参数用NULL似乎会有警告信息。而且删除的时候,会使增个系统的速度慢的难以接受。以前自己写过一个T树的实现,平衡化操作似乎并不慢的样子。以前曾经看过一个文章,说是在多线程情况下,B+树的效率比T树高,B+树的平衡化应该比T树开销小一点吧(我对B+树不熟悉)。或者这里不用B+树做索引页可以。
另外我要删除的数据一般是根据时间先后的,现在我是根据时间计算出一个值(比如从2000年开始至今的天数之类)直接放到key里了。

[ 本帖最后由 xie995 于 2008-11-14 13:42 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP