免费注册 查看新帖 |

Chinaunix

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

[C] 实现了一个文件+mmap的红黑树,欢迎测试 [复制链接]

论坛徽章:
0
跳转到指定楼层
[收藏(0)] [报告]
发表于 2009-09-29 11:38 |只看该作者 |正序浏览
用于对需要永久存储 而且需要查找和排序的int类数据,好处是减少从文件读数据在内存构建红黑树的时间 另外使用mmap保证修改内存后磁盘文件会同步,无须手动sync和再次写入文件。
一个 mmtree文件里可以构件2G个树节点.
可以通过mmtree_new_tree()生成新的树.
mmtree_insert()  写入新节点 如果old返回为非空表示存在该节点。
mmtree_find() 查找节点
mmtree_remove() 移除节点
。。。。

链接:
http://hispider.googlecode.com/s ... /src/utils/mmtree.h
http://hispider.googlecode.com/s ... /src/utils/mmtree.c
多线程使用添加这个文件 并且添加编译选项 -DHAVE_PTHREAD
http://hispider.googlecode.com/s ... /src/utils/mutext.h

应某同学的建议放一个打包上来,代码测试有问题尽快告诉我。

mmtree.h

  1. #ifndef _MMTREE_H
  2. #define _MMTREE_H
  3. #define MMTREE_INCRE_NUM   10000
  4. typedef struct _MTNODE
  5. {
  6.     int data;
  7.     int key;
  8.     int left;
  9.     int right;
  10.     int parent;
  11.     int color;
  12. }MTNODE;
  13. typedef struct _MTSTATE
  14. {
  15.     int left;
  16.     int current;
  17.     int total;
  18.     int qleft;
  19.     int qfirst;
  20.     int qlast;
  21. }MTSTATE;
  22. typedef struct _MMTREE
  23. {
  24.     off_t size;
  25.     void *start;
  26.     MTSTATE *state;
  27.     MTNODE *map;
  28.     int fd;
  29.     void *mutex;
  30. }MMTREE;
  31. void *mmtree_init(char *file);
  32. int mmtree_new_tree(void *mmtree, int key, int data);
  33. int mmtree_insert(void *mmtree, int *prootid, int key, int data, int *old);
  34. int mmtree_get(void *mmtree, int nodeid, int *key, int *data);
  35. int mmtree_find(void *mmtree, int rootid, int key, int *data);
  36. int mmtree_min(void *mmtree, int rootid, int *key, int *data);
  37. int mmtree_max(void *mmtree, int rootid, int *key, int *data);
  38. int mmtree_next(void *mmtree, int rootid, int nodeid, int *key, int *data);
  39. int mmtree_prev(void *mmtree, int rootid, int nodeid, int *key, int *data);
  40. int mmtree_set_data(void *mmtree, int nodeid, int data);
  41. void mmtree_view_tree(void *mmtree, int rootid, FILE *fp);
  42. void mmtree_remove(void *mmtree, int *prootid, int nodeid, int *key, int *data);
  43. void mmtree_remove_tree(void *mmtree, int rootid);
  44. void mmtree_close(void *mmtree);
  45. #endif
复制代码

[ 本帖最后由 redor 于 2009-9-29 15:53 编辑 ]

mmtree.zip

5.35 KB, 下载次数: 257

论坛徽章:
0
37 [报告]
发表于 2009-10-23 09:57 |只看该作者
原帖由 wisage 于 2009-10-21 17:59 发表
下载连接好像失效了,请楼主看下,谢谢啦!
如果谁下了的话给我发一份好吗:wisage@gmail.com
谢谢!



我测了一下好像可以下

不行你下这个吧 http://libibase.googlecode.com/files/mmtree.zip

论坛徽章:
0
36 [报告]
发表于 2009-10-21 17:59 |只看该作者

连接好像失效了

下载连接好像失效了,请楼主看下,谢谢啦!
如果谁下了的话给我发一份好吗:wisage@gmail.com
谢谢!

论坛徽章:
0
35 [报告]
发表于 2009-10-09 11:41 |只看该作者
ding

论坛徽章:
0
34 [报告]
发表于 2009-10-07 18:45 |只看该作者
原帖由 我要思考 于 2009-10-6 01:44 发表
mmtree_new_tree(void *mmtree, int key, int data);

int key 这个是什么值?



也是一个节点, 只不过这个节点比较特殊, 是root节点, 创建树的过程中 rootid可能会更改, 所以在insert() 和 remove()的时候传入的rootid是int * 类型.

论坛徽章:
0
33 [报告]
发表于 2009-10-06 01:44 |只看该作者
mmtree_new_tree(void *mmtree, int key, int data);

int key 这个是什么值?

论坛徽章:
0
32 [报告]
发表于 2009-10-05 13:44 |只看该作者
很强大嘛,拿 来用了!

论坛徽章:
0
31 [报告]
发表于 2009-10-04 20:52 |只看该作者
原帖由 我要思考 于 2009-10-3 23:11 发表
请问有没有 使用例子代码


mmtree.c 里有一个main() 有调用例子 可以直接编译执行。

论坛徽章:
0
30 [报告]
发表于 2009-10-03 23:11 |只看该作者
请问有没有 使用例子代码

论坛徽章:
0
29 [报告]
发表于 2009-10-01 01:08 |只看该作者
学习了

论坛徽章:
0
28 [报告]
发表于 2009-09-30 09:59 |只看该作者
原帖由 converse 于 2009-9-29 22:52 发表
呵呵,我说那话的意思是他不应该假设容量是"够用"的,需要考虑到不够用的时候该怎么办,或者说,程序写的更健壮一些,多考虑一些情况.



理解了, 哈哈, 等我有空改改, 把int改成一个统一的类型, 然后可以自己编译的时候修改类型。
不过不管什么应用 24 * 2G 内存占用就是48G, 目前这类机器还比较少, 就算有这类机器也不会用这个单一方式去实现, 哈哈
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP