发布一个mmap的trie_midrmm02_新浪博客

发布一个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
原文地址:https://www.cnblogs.com/lexus/p/2931862.html