- 论坛徽章:
- 0
|
用于对需要永久存储 而且需要查找和排序的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
- #ifndef _MMTREE_H
- #define _MMTREE_H
- #define MMTREE_INCRE_NUM 10000
- typedef struct _MTNODE
- {
- int data;
- int key;
- int left;
- int right;
- int parent;
- int color;
- }MTNODE;
- typedef struct _MTSTATE
- {
- int left;
- int current;
- int total;
- int qleft;
- int qfirst;
- int qlast;
- }MTSTATE;
- typedef struct _MMTREE
- {
- off_t size;
- void *start;
- MTSTATE *state;
- MTNODE *map;
- int fd;
- void *mutex;
- }MMTREE;
- void *mmtree_init(char *file);
- int mmtree_new_tree(void *mmtree, int key, int data);
- int mmtree_insert(void *mmtree, int *prootid, int key, int data, int *old);
- int mmtree_get(void *mmtree, int nodeid, int *key, int *data);
- int mmtree_find(void *mmtree, int rootid, int key, int *data);
- int mmtree_min(void *mmtree, int rootid, int *key, int *data);
- int mmtree_max(void *mmtree, int rootid, int *key, int *data);
- int mmtree_next(void *mmtree, int rootid, int nodeid, int *key, int *data);
- int mmtree_prev(void *mmtree, int rootid, int nodeid, int *key, int *data);
- int mmtree_set_data(void *mmtree, int nodeid, int data);
- void mmtree_view_tree(void *mmtree, int rootid, FILE *fp);
- void mmtree_remove(void *mmtree, int *prootid, int nodeid, int *key, int *data);
- void mmtree_remove_tree(void *mmtree, int rootid);
- void mmtree_close(void *mmtree);
- #endif
复制代码
[ 本帖最后由 redor 于 2009-9-29 15:53 编辑 ] |
|