发布一个mmap的trie_midrmm02_新浪博客     发布一个mmap的trie     (2012-04-13 03:09:22)     转载▼     标签:     杂谈              发布一个mmap的trie 本帖最后由 redor 于 2010-04-13 17:24 编辑
      http://libibase.googlecode.com/svn/trunk/devel/utils/mmtrie.h     http://libibase.googlecode.com/svn/trunk/devel/utils/mmtrie.c     附件版本有问题,直接下这个吧 http://libibase.googlecode.com/files/mmtrie.zip     写这个的出发点是吧之前做的trie能写到文件而且能很容易mmap到内存, 可以用于输入法 搜索引擎分词 词表的功能, 共享前缀存储, 支持最大20亿节点.     简单一点可以当一个hash表使用, 查找的时间复杂度为 N* Log(256) N为字符长度, key可以为二进制的数据, value 必须为int类型, 不能为0, 因为mmtrie_get()/find() 没有结果的情况下为0,     如果需要set value为0的话自己+1, 出来的时候-1就好了.     大概数据结构和使用方法如下:
 
      typedef struct _MMTRIE     {     MMTRSTATE *state;     MMTRNODE *nodes;     void *map;     off_t file_size;     int fd;     void *mutex;
      int(*add)(struct _MMTRIE *, char *key, int nkey, int data);     int(*get)(struct _MMTRIE *, char *key, int nkey);     int(*find)(struct _MMTRIE *, char *key, int nkey, int *len);     int(*maxfind)(struct _MMTRIE *, char *key, int nkey, int *len);     int(*radd)(struct _MMTRIE *, char *key, int nkey, int data);     int(*rget)(struct _MMTRIE *, char *key, int nkey);     int(*rfind)(struct _MMTRIE *, char *key, int nkey, int *len);     int(*rmaxfind)(struct _MMTRIE *, char *key, int nkey, int *len);     void (*clean)(struct _MMTRIE *);     }MMTRIE;
      MMTRIE *mmtrie_init(char *file);
      int mmtrie_add(struct _MMTRIE *, char *key, int nkey, int data);
      int mmtrie_get(struct _MMTRIE *, char *key, int nkey);
      int mmtrie_find(struct _MMTRIE *, char *key, int nkey, int *len);
      int mmtrie_maxfind(st
      各位的c语言是怎样入门的呢?     ruct _MMTRIE *, char *key, int nkey, int *len);
      int mmtrie_radd(struct _MMTRIE *, char *key, int nkey, int data);
      int mmtrie_rget(struct _MMTRIE *, char *key, int nkey);
      int mmtrie_rfind(struct _MMTRIE *, char *key, int nkey, int *len);
      int mmtrie_rmaxfind(struct _MMTRIE *, char *key, int nkey, int *len);
      voidmmtrie_clean(struct _MMTRIE *);
      //gcc -o mmtr mmtrie.c -D_DEBUG_MMTRIE && ./mmtr     static char *mmfile = "/tmp/test.mmtrie";     int main()     {     char word, *p = NULL;     MMTRIE *mmtrie = NULL;     int i = 0, n = 0, x = 0;
      if((mmtrie = mmtrie_init(mmfile)))     {     p = "abbbxxx"; mmtrie_add(mmtrie, p, strlen(p), 1);fprintf(stdout, "add(%s:%d)\r\n", p, 1);     p = "abb"; mmtrie_add(mmtrie, p, strlen(p), 2);fprintf(stdout, "add(%s:%d)\r\n", p, 2);     p = "abbx"; mmtrie_add(mmtrie, p, strlen(p), 3);fprintf(stdout, "add(%s:%d)\r\n", p, 3);     p = "abbxddd"; mmtrie_add(mmtrie, p, strlen(p), 4);fprintf(stdout, "add(%s:%d)\r\n", p, 4);     p = "abbxdddx"; mmtrie_add(mmtrie, p, strlen(p), 5);fprintf(stdout, "add(%s:%d)\r\n", p, 5);     p = "abbx";x = mmtrie_get(mmtrie, p, strlen(p)); if(x http://www.dj1988.com!= 0)fprintf(stdout, "get(%s:%d)\r\n", p, x);     p = "abbxddddd";x = mmtrie_find(mmtrie, p, strlen(p), &n); if(x != 0){fprintf(stdout, "find(%s => %.*s:%d)\r\n", p, n, p, x);}     p = "abbxddddd";x = mmtrie_maxfind(mmtrie, p, strlen(p), &n); if(x != 0){fprintf(stdout, "maxfind(%s => %.*s:%d)\r\n", p, n, p, x);}     //reverse     p = "asscxxx"; mmtrie_radd(mmtrie, p, strlen(p), 1);fprintf(stdout, "radd(%s:%d)\r\n", p, 1);     p = "adfdsfscxxx"; mmtrie_radd(mmtrie, p, strlen(p), 2);fprintf(stdout, "radd(%s:%d)\r\n", p, 2);     p = "dafdsfscxxx"; mmtrie_radd(mmtrie, p, strlen(p), 3);fprintf(stdout, "radd(%s:%d)\r\n", p, 3);     p = "aeffdsxccc"; mmtrie_radd(mmtrie, p, strlen(p), 4);fprintf(stdout, "radd(%s:%d)\r\n", p, 4);     p = "adsssxxscxxx"; mmtrie_radd(mmtrie, p, strlen(p), 5);fprintf(stdout, "radd(%s:%d)\r\n", p, 5);     p = "dafdsfssddcxxx";x = mmtrie_rget(mmtrie, p, strlen(p)); if(x != 0)fprintf(stdout, "rget(%s:%d)\r\n", p, x);     p = "adsssxxscxxx";x = mmtrie_rfind(mmtrie, p, strlen(p), &n); if(x != 0){fprintf(stdout, "rfind(%s => %s:%d)\r\n", p, p+(strlen(p)-n), x);}     p = "sadfsfsdadfdsfscxxx";x = mmtrie_rmaxfind(mmtrie, p, strlen(p), &n); if(x != 0){fprintf(stdout, "rmaxfind(%s => %s:%d)\r\n", p, p+(strlen(p)-n), x);}     mmtrie->clean(mmtrie);     }     }     [ 本帖最后由 redor 于 2010-1-27 11:55 编辑 ]楼主纯爷们儿原帖由 c/unix 于 2010-1-27 09:07 发表 http://bbs.chinaunix.net/images/common/back.gif     楼主纯爷们儿
 
      谢谢啊! 这话现在怎么听都别扭.... 失去原味了支持LZ。不错http://www.jssxd.com/,支持楼主能给点注释就更完美了,让我们菜鸟也能学习学习,瞻仰瞻仰!哈哈..学习下。好强大 但是不太会用。。。出发点是不是想实现一个数据的存储,如果内存不够大,就利用mmap存到文件当中去。感觉不如直接用数据库快,比如sql-lite等,不过作为研究肯定是值得称赞的 本帖最后由 redor 于 2010-04-12 14:09 编辑
      回复 9# w_x_x
 
      mmap是有一个比较好的内存和文件的同步方案, 易于导入, 这个就是一个基于mmap的trie 跟sqllite根本不是一个东西...... 
      用于存储数据的还有一个在这里, http://libibase.googlecode.com/svn/trunk/devel/hibase/src/utils/db.c 
  
 
         
	
        
     
 
 |